1 /** @file
2 
3   The definition of CFormPkg's member function
4 
5 Copyright (c) 2004 - 2019, Intel Corporation. All rights reserved.<BR>
6 SPDX-License-Identifier: BSD-2-Clause-Patent
7 
8 **/
9 
10 #ifndef _EFIIFRCLASS_H_
11 #define _EFIIFRCLASS_H_
12 
13 #include "string.h"
14 #include "EfiVfr.h"
15 #include "VfrError.h"
16 #include "VfrUtilityLib.h"
17 
18 #define NO_QST_REFED "no question refered"
19 
20 struct PACKAGE_DATA {
21   CHAR8   *Buffer;
22   UINT32  Size;
23 };
24 
25 /*
26  * The functions below are used for flags setting
27  */
_FLAGS_ZERO(IN UINT8 & Flags)28 static inline BOOLEAN _FLAGS_ZERO (
29   IN UINT8 &Flags
30   )
31 {
32   return Flags == 0;
33 }
34 
_FLAG_CLEAR(IN UINT8 & Flags,IN UINT8 Mask)35 static inline VOID _FLAG_CLEAR (
36   IN UINT8 &Flags,
37   IN UINT8 Mask
38   )
39 {
40   Flags &= (~Mask);
41 }
42 
_FLAG_TEST_AND_CLEAR(IN UINT8 & Flags,IN UINT8 Mask)43 static inline UINT8 _FLAG_TEST_AND_CLEAR (
44   IN UINT8 &Flags,
45   IN UINT8 Mask
46   )
47 {
48   UINT8 Ret = Flags & Mask;
49   Flags &= (~Mask);
50   return Ret;
51 }
52 
_IS_EQUAL(IN UINT8 & Flags,IN UINT8 Value)53 static inline UINT8 _IS_EQUAL (
54   IN UINT8 &Flags,
55   IN UINT8 Value
56   )
57 {
58   return Flags == Value;
59 }
60 
61 /*
62  * The definition of CIfrBin
63  */
64 typedef enum {
65   PENDING,
66   ASSIGNED
67 } ASSIGN_FLAG;
68 
69 struct SPendingAssign {
70   CHAR8                   *mKey;  // key ! unique
71   VOID                    *mAddr;
72   UINT32                  mLen;
73   ASSIGN_FLAG             mFlag;
74   UINT32                  mLineNo;
75   CHAR8                   *mMsg;
76   struct SPendingAssign   *mNext;
77 
78   SPendingAssign (IN CHAR8 *, IN VOID *, IN UINT32, IN UINT32, IN CONST CHAR8 *);
79   ~SPendingAssign ();
80 
81   VOID   SetAddrAndLen (IN VOID *, IN UINT32);
82   VOID   AssignValue (IN VOID *, IN UINT32);
83   CHAR8 * GetKey (VOID);
84 
85 private:
86   SPendingAssign (IN CONST SPendingAssign&);             // Prevent copy-construction
87   SPendingAssign& operator= (IN CONST SPendingAssign&);  // Prevent assignment
88 };
89 
90 struct SBufferNode {
91   CHAR8              *mBufferStart;
92   CHAR8              *mBufferEnd;
93   CHAR8              *mBufferFree;
94   struct SBufferNode *mNext;
95 };
96 
97 typedef struct {
98   EFI_GUID *OverrideClassGuid;
99 } INPUT_INFO_TO_SYNTAX;
100 
101 class CFormPkg {
102 private:
103   UINT32              mBufferSize;
104   SBufferNode         *mBufferNodeQueueHead;
105   SBufferNode         *mBufferNodeQueueTail;
106   SBufferNode         *mCurrBufferNode;
107 
108   SBufferNode         *mReadBufferNode;
109   UINT32              mReadBufferOffset;
110 
111   UINT32              mPkgLength;
112 
113   VOID                _WRITE_PKG_LINE (IN FILE *, IN UINT32 , IN CONST CHAR8 *, IN CHAR8 *, IN UINT32);
114   VOID                _WRITE_PKG_END (IN FILE *, IN UINT32 , IN CONST CHAR8 *, IN CHAR8 *, IN UINT32);
115   SBufferNode *       GetBinBufferNodeForAddr (IN CHAR8 *);
116   SBufferNode *       CreateNewNode ();
117   SBufferNode *       GetNodeBefore (IN SBufferNode *);
118   EFI_VFR_RETURN_CODE InsertNodeBefore (IN SBufferNode *, IN SBufferNode *);
119 
120 private:
121   SPendingAssign      *PendingAssignList;
122 
123 public:
124   CFormPkg (IN UINT32 BufferSize = 4096);
125   ~CFormPkg ();
126 
127   CHAR8             * IfrBinBufferGet (IN UINT32);
128   inline UINT32       GetPkgLength (VOID);
129 
130   VOID                Open ();
131   UINT32              Read (IN CHAR8 *, IN UINT32);
132   VOID                Close ();
133 
134   EFI_VFR_RETURN_CODE BuildPkgHdr (OUT EFI_HII_PACKAGE_HEADER **);
135   EFI_VFR_RETURN_CODE BuildPkg (IN FILE *, IN PACKAGE_DATA *PkgData = NULL);
136   EFI_VFR_RETURN_CODE BuildPkg (OUT PACKAGE_DATA &);
137   EFI_VFR_RETURN_CODE GenCFile (IN CHAR8 *, IN FILE *, IN PACKAGE_DATA *PkgData = NULL);
138 
139 private:
140   CFormPkg (IN CONST CFormPkg&);             // Prevent copy-construction
141   CFormPkg& operator= (IN CONST CFormPkg&);  // Prevent assignment
142 
143 public:
144   EFI_VFR_RETURN_CODE AssignPending (IN CHAR8 *, IN VOID *, IN UINT32, IN UINT32, IN CONST CHAR8 *Msg = NULL);
145   VOID                DoPendingAssign (IN CHAR8 *, IN VOID *, IN UINT32);
146   bool                HavePendingUnassigned (VOID);
147   VOID                PendingAssignPrintAll (VOID);
148   EFI_VFR_RETURN_CODE   DeclarePendingQuestion (
149     IN CVfrVarDataTypeDB   &lCVfrVarDataTypeDB,
150     IN CVfrDataStorage     &lCVfrDataStorage,
151     IN CVfrQuestionDB      &lCVfrQuestionDB,
152     IN EFI_GUID            *LocalFormSetGuid,
153     IN UINT32              LineNo,
154     OUT CHAR8              **InsertOpcodeAddr
155     );
156   EFI_VFR_RETURN_CODE AdjustDynamicInsertOpcode (
157     IN CHAR8              *LastFormEndAddr,
158     IN CHAR8              *InsertOpcodeAddr,
159     IN BOOLEAN            CreateOpcodeAfterParsingVfr
160     );
161   CHAR8 *             GetBufAddrBaseOnOffset (
162     IN UINT32             Offset
163     );
164 };
165 
166 extern CFormPkg       gCFormPkg;
167 extern CVfrStringDB   gCVfrStringDB;
168 extern UINT32         gAdjustOpcodeOffset;
169 extern BOOLEAN        gNeedAdjustOpcode;
170 
171 struct SIfrRecord {
172   UINT32     mLineNo;
173   CHAR8      *mIfrBinBuf;
174   UINT8      mBinBufLen;
175   UINT32     mOffset;
176   SIfrRecord *mNext;
177 
178   SIfrRecord (VOID);
179   ~SIfrRecord (VOID);
180 };
181 
182 
183 #define EFI_IFR_RECORDINFO_IDX_INVALUD 0xFFFFFF
184 #define EFI_IFR_RECORDINFO_IDX_START   0x0
185 #define EFI_HII_MAX_SUPPORT_DEFAULT_TYPE  0x08
186 
187 struct QuestionDefaultRecord {
188   BOOLEAN     mIsDefaultIdExist[EFI_HII_MAX_SUPPORT_DEFAULT_TYPE]; // Record the default id in mAllDefaultIdArray[EFI_HII_MAX_SUPPORT_DEFAULT_TYPE]
189                                                                    // whether exists in current question.
190 
191   SIfrRecord  *mDefaultValueRecord;   // Point to the default value record in RecordList which has smallest default Id.
192                                       // (for checkbox it may be NULL, because the dedault value is always true when the flag is set.)
193 
194   BOOLEAN     mIsDefaultOpcode;       // whether the default value with smallest default id is given by default opcode.
195                                       // (for oneof and checkbox default info may be given by flag.)
196 
197   UINT16      mDefaultNumber;         // The default number of this question.
198 };
199 
200 class CIfrRecordInfoDB {
201 private:
202   bool       mSwitch;
203   UINT32     mRecordCount;
204   SIfrRecord *mIfrRecordListHead;
205   SIfrRecord *mIfrRecordListTail;
206   UINT8      mAllDefaultTypeCount;
207   UINT16     mAllDefaultIdArray[EFI_HII_MAX_SUPPORT_DEFAULT_TYPE];
208 
209   SIfrRecord * GetRecordInfoFromIdx (IN UINT32);
210   BOOLEAN          CheckQuestionOpCode (IN UINT8);
211   BOOLEAN          CheckIdOpCode (IN UINT8);
212   EFI_QUESTION_ID  GetOpcodeQuestionId (IN EFI_IFR_OP_HEADER *);
213 public:
214   CIfrRecordInfoDB (VOID);
215   ~CIfrRecordInfoDB (VOID);
216 
TurnOn(VOID)217   inline VOID TurnOn (VOID) {
218     mSwitch = TRUE;
219   }
220 
TurnOff(VOID)221   inline VOID TurnOff (VOID) {
222     mSwitch = FALSE;
223   }
224 
225   SIfrRecord * GetRecordInfoFromOffset (IN UINT32);
226   VOID        IfrAdjustOffsetForRecord (VOID);
227   BOOLEAN     IfrAdjustDynamicOpcodeInRecords (IN BOOLEAN);
228 
229   UINT32      IfrRecordRegister (IN UINT32, IN CHAR8 *, IN UINT8, IN UINT32);
230   VOID        IfrRecordInfoUpdate (IN UINT32, IN UINT32, IN CHAR8*, IN UINT8, IN UINT32);
231   VOID        IfrRecordOutput (IN FILE *, IN UINT32 LineNo);
232   VOID        IfrRecordOutput (OUT PACKAGE_DATA &);
233   EFI_VFR_RETURN_CODE  IfrRecordAdjust (VOID);
234   VOID        IfrUpdateRecordInfoForDynamicOpcode (IN BOOLEAN);
235   VOID        IfrCheckAddDefaultRecord (IN BOOLEAN, IN BOOLEAN);
236   VOID        IfrGetDefaultStoreInfo ();
237   VOID        IfrCreateDefaultRecord (IN UINT8 Size,IN UINT16 DefaultId,IN UINT8 Type,IN UINT32 LineNo,IN EFI_IFR_TYPE_VALUE Value);
238   VOID        IfrCreateDefaultForQuestion (IN  SIfrRecord *, IN  QuestionDefaultRecord *);
239   VOID        IfrParseDefaulInfoInQuestion (IN  SIfrRecord *, OUT QuestionDefaultRecord *);
240   VOID        IfrAddDefaultToBufferConfig (IN  UINT16, IN  SIfrRecord *,IN  EFI_IFR_TYPE_VALUE);
241 
242 private:
243   CIfrRecordInfoDB (IN CONST CIfrRecordInfoDB&);             // Prevent copy-construction
244   CIfrRecordInfoDB& operator= (IN CONST CIfrRecordInfoDB&);  // Prevent assignment
245 };
246 
247 extern CIfrRecordInfoDB gCIfrRecordInfoDB;
248 
249 /*
250  * The definition of CIfrObj
251  */
252 extern BOOLEAN  gCreateOp;
253 
254 class CIfrObj {
255 private:
256   BOOLEAN mDelayEmit;
257 
258   CHAR8   *mObjBinBuf;
259   UINT8   mObjBinLen;
260   UINT32  mLineNo;
261   UINT32  mRecordIdx;
262   UINT32  mPkgOffset;
263 
264 public:
265   CIfrObj (IN UINT8 OpCode, OUT CHAR8 **IfrObj = NULL, IN UINT8 ObjBinLen = 0, IN BOOLEAN DelayEmit = FALSE);
266   virtual ~CIfrObj(VOID);
267 
268   VOID    _EMIT_PENDING_OBJ (VOID);
269 
SetLineNo(IN UINT32 LineNo)270   inline VOID    SetLineNo (IN UINT32 LineNo) {
271     mLineNo = LineNo;
272   }
273 
274   template<typename T>
GetObjBinAddr(VOID)275   inline T * GetObjBinAddr (VOID) {
276     return reinterpret_cast<T *>(mObjBinBuf);
277   }
278 
GetObjBinOffset(VOID)279   inline UINT32 GetObjBinOffset (VOID) {
280     return mPkgOffset;
281   }
282 
GetObjBinLen(VOID)283   inline UINT8   GetObjBinLen (VOID) {
284     return mObjBinLen;
285   }
286 
ExpendObjBin(IN UINT8 Size)287   inline bool ExpendObjBin (IN UINT8 Size) {
288     if ((mDelayEmit == TRUE) && ((mObjBinLen + Size) > mObjBinLen)) {
289       mObjBinLen = mObjBinLen + Size;
290       return TRUE;
291     } else {
292       return FALSE;
293     }
294   }
295 
ShrinkObjBin(IN UINT8 Size)296   inline bool ShrinkObjBin (IN UINT8 Size) {
297     if ((mDelayEmit == TRUE) && (mObjBinLen > Size)) {
298       mObjBinLen -= Size;
299       return TRUE;
300     } else {
301       return FALSE;
302     }
303   }
304 };
305 
306 /*
307  * The definition of CIfrOpHeader
308  */
309 class CIfrOpHeader {
310 private:
311   EFI_IFR_OP_HEADER *mHeader;
312 
313 public:
314   CIfrOpHeader (IN UINT8 OpCode, IN VOID *StartAddr, IN UINT8 Length = 0);
315   CIfrOpHeader (IN CIfrOpHeader &);
316   CIfrOpHeader& operator=(IN CONST CIfrOpHeader &);
317 
IncLength(UINT8 Size)318   VOID IncLength (UINT8 Size) {
319     if ((mHeader->Length + Size) > mHeader->Length) {
320       mHeader->Length = mHeader->Length + Size;
321     }
322   }
323 
DecLength(UINT8 Size)324   VOID DecLength (UINT8 Size) {
325     if (mHeader->Length >= Size) {
326       mHeader->Length -= Size;
327     }
328   }
329 
GetLength()330   UINT8 GetLength () {
331     return mHeader->Length;
332   }
333 
GetScope()334   UINT8 GetScope () {
335     return mHeader->Scope;
336   }
337 
SetScope(IN UINT8 Scope)338   VOID SetScope (IN UINT8 Scope) {
339     mHeader->Scope = Scope;
340   }
341 
UpdateHeader(IN EFI_IFR_OP_HEADER * Header)342   VOID UpdateHeader (IN EFI_IFR_OP_HEADER *Header) {
343     mHeader = Header;
344   }
345 
GetOpCode()346   UINT8 GetOpCode () {
347     return mHeader->OpCode;
348   }
349 };
350 
351 extern UINT8 gScopeCount;
352 
353 /*
354  * The definition of CIfrStatementHeader
355  */
356 class CIfrStatementHeader {
357 private:
358   EFI_IFR_STATEMENT_HEADER *mHeader;
359 
360 public:
CIfrStatementHeader(IN EFI_IFR_STATEMENT_HEADER * StartAddr)361   CIfrStatementHeader (
362     IN EFI_IFR_STATEMENT_HEADER *StartAddr
363   ) : mHeader ((EFI_IFR_STATEMENT_HEADER *)StartAddr) {
364     mHeader         = StartAddr;
365     mHeader->Help   = EFI_STRING_ID_INVALID;
366     mHeader->Prompt = EFI_STRING_ID_INVALID;
367   }
368 
GetStatementHeader()369   EFI_IFR_STATEMENT_HEADER *GetStatementHeader () {
370     return mHeader;
371   }
372 
SetPrompt(IN EFI_STRING_ID Prompt)373   VOID SetPrompt (IN EFI_STRING_ID Prompt) {
374     mHeader->Prompt = Prompt;
375   }
376 
SetHelp(IN EFI_STRING_ID Help)377   VOID SetHelp (IN EFI_STRING_ID Help) {
378     mHeader->Help = Help;
379   }
380 };
381 
382 /*
383  * The definition of CIfrQuestionHeader
384  */
385 #define EFI_IFR_QUESTION_FLAG_DEFAULT 0
386 
387 class CIfrQuestionHeader : public CIfrStatementHeader {
388 private:
389   EFI_IFR_QUESTION_HEADER *mHeader;
390 
QH2SH(EFI_IFR_QUESTION_HEADER * Qheader)391   EFI_IFR_STATEMENT_HEADER * QH2SH (EFI_IFR_QUESTION_HEADER *Qheader) {
392     return &(Qheader)->Header;
393   }
394 
395 public:
QUESTION_ID(VOID)396   EFI_QUESTION_ID QUESTION_ID (VOID) {
397     return mHeader->QuestionId;
398   }
399 
VARSTORE_ID(VOID)400   EFI_VARSTORE_ID VARSTORE_ID (VOID) {
401     return mHeader->VarStoreId;
402   }
403 
VARSTORE_INFO(OUT EFI_VARSTORE_INFO * Info)404   VOID VARSTORE_INFO (OUT EFI_VARSTORE_INFO *Info) {
405     if (Info != NULL) {
406       Info->mVarStoreId   = mHeader->VarStoreId;
407       memmove (&Info->mVarStoreId, &mHeader->VarStoreInfo, sizeof (Info->mVarStoreId));
408     }
409   }
410 
FLAGS(VOID)411   UINT8 FLAGS (VOID) {
412     return mHeader->Flags;
413   }
414 
415 public:
416   CIfrQuestionHeader (
417     IN EFI_IFR_QUESTION_HEADER *StartAddr,
418     IN UINT8 Flags = EFI_IFR_QUESTION_FLAG_DEFAULT
CIfrStatementHeader(QH2SH (StartAddr))419   ) : CIfrStatementHeader (QH2SH(StartAddr)) {
420     mHeader                         = StartAddr;
421     mHeader->QuestionId             = EFI_QUESTION_ID_INVALID;
422     mHeader->VarStoreId             = EFI_VARSTORE_ID_INVALID;
423     mHeader->VarStoreInfo.VarName   = EFI_STRING_ID_INVALID;
424     mHeader->VarStoreInfo.VarOffset = EFI_VAROFFSET_INVALID;
425     mHeader->Flags                  = Flags;
426   }
427 
SetQuestionId(IN EFI_QUESTION_ID QuestionId)428   VOID SetQuestionId (IN EFI_QUESTION_ID QuestionId) {
429     mHeader->QuestionId = QuestionId;
430   }
431 
SetVarStoreInfo(IN EFI_VARSTORE_INFO * Info)432   VOID SetVarStoreInfo (IN EFI_VARSTORE_INFO *Info) {
433     mHeader->VarStoreId             = Info->mVarStoreId;
434     mHeader->VarStoreInfo.VarName   = Info->mInfo.mVarName;
435     mHeader->VarStoreInfo.VarOffset = Info->mInfo.mVarOffset;
436   }
437 
SetFlags(IN UINT8 Flags)438   EFI_VFR_RETURN_CODE SetFlags (IN UINT8 Flags) {
439     if (_FLAG_TEST_AND_CLEAR (Flags, EFI_IFR_FLAG_READ_ONLY)) {
440       mHeader->Flags |= EFI_IFR_FLAG_READ_ONLY;
441     }
442 
443     _FLAG_CLEAR (Flags, 0x02);
444 
445     if (_FLAG_TEST_AND_CLEAR (Flags, EFI_IFR_FLAG_CALLBACK)) {
446       mHeader->Flags |= EFI_IFR_FLAG_CALLBACK;
447     }
448 
449     //
450     // ignore NVAccessFlag
451     //
452     _FLAG_CLEAR (Flags, 0x08);
453 
454     if (_FLAG_TEST_AND_CLEAR (Flags, EFI_IFR_FLAG_RESET_REQUIRED)) {
455       mHeader->Flags |= EFI_IFR_FLAG_RESET_REQUIRED;
456     }
457 
458     if (_FLAG_TEST_AND_CLEAR (Flags, EFI_IFR_FLAG_RECONNECT_REQUIRED)) {
459       mHeader->Flags |= EFI_IFR_FLAG_RECONNECT_REQUIRED;
460     }
461 
462     //
463     //  Set LateCheck Flag to compatible for framework flag
464     //  but it uses 0x20 as its flag, if in the future UEFI may take this flag
465     //
466     if (_FLAG_TEST_AND_CLEAR (Flags, 0x20)) {
467       mHeader->Flags |= 0x20;
468     }
469 
470     if (_FLAG_TEST_AND_CLEAR (Flags, EFI_IFR_FLAG_OPTIONS_ONLY)) {
471       mHeader->Flags |= EFI_IFR_FLAG_OPTIONS_ONLY;
472     }
473 
474     return _FLAGS_ZERO (Flags) ? VFR_RETURN_SUCCESS : VFR_RETURN_FLAGS_UNSUPPORTED;
475   }
476 
UpdateCIfrQuestionHeader(IN EFI_IFR_QUESTION_HEADER * Header)477   VOID UpdateCIfrQuestionHeader (IN EFI_IFR_QUESTION_HEADER *Header) {
478     mHeader = Header;
479   }
480 };
481 
482 /*
483  * The definition of CIfrMinMaxStepData
484  */
485 class CIfrMinMaxStepData {
486 private:
487   MINMAXSTEP_DATA *mMinMaxStepData;
488   BOOLEAN         ValueIsSet;
489   BOOLEAN         IsNumeric;
490 
491 public:
mMinMaxStepData(DataAddr)492   CIfrMinMaxStepData (MINMAXSTEP_DATA *DataAddr, BOOLEAN NumericOpcode=FALSE) : mMinMaxStepData (DataAddr) {
493     mMinMaxStepData->u64.MinValue = 0;
494     mMinMaxStepData->u64.MaxValue = 0;
495     mMinMaxStepData->u64.Step     = 0;
496     ValueIsSet = FALSE;
497     IsNumeric = NumericOpcode;
498   }
499 
SetMinMaxStepData(IN UINT64 MinValue,IN UINT64 MaxValue,IN UINT64 Step)500   VOID SetMinMaxStepData (IN UINT64 MinValue, IN UINT64 MaxValue, IN UINT64 Step) {
501     if (!ValueIsSet) {
502       mMinMaxStepData->u64.MinValue = MinValue;
503       mMinMaxStepData->u64.MaxValue = MaxValue;
504       ValueIsSet = TRUE;
505     } else {
506       if (MinValue < mMinMaxStepData->u64.MinValue) {
507         mMinMaxStepData->u64.MinValue = MinValue;
508       }
509       if (MaxValue > mMinMaxStepData->u64.MaxValue) {
510         mMinMaxStepData->u64.MaxValue = MaxValue;
511       }
512     }
513     mMinMaxStepData->u64.Step = Step;
514   }
515 
SetMinMaxStepData(IN UINT32 MinValue,IN UINT32 MaxValue,IN UINT32 Step)516   VOID SetMinMaxStepData (IN UINT32 MinValue, IN UINT32 MaxValue, IN UINT32 Step) {
517     if (!ValueIsSet) {
518       mMinMaxStepData->u32.MinValue = MinValue;
519       mMinMaxStepData->u32.MaxValue = MaxValue;
520       ValueIsSet = TRUE;
521     } else {
522       if (MinValue < mMinMaxStepData->u32.MinValue) {
523         mMinMaxStepData->u32.MinValue = MinValue;
524       }
525       if (MaxValue > mMinMaxStepData->u32.MaxValue) {
526         mMinMaxStepData->u32.MaxValue = MaxValue;
527       }
528     }
529     mMinMaxStepData->u32.Step = Step;
530   }
531 
SetMinMaxStepData(IN UINT16 MinValue,IN UINT16 MaxValue,IN UINT16 Step)532   VOID SetMinMaxStepData (IN UINT16 MinValue, IN UINT16 MaxValue, IN UINT16 Step) {
533     if (!ValueIsSet) {
534       mMinMaxStepData->u16.MinValue = MinValue;
535       mMinMaxStepData->u16.MaxValue = MaxValue;
536       ValueIsSet = TRUE;
537     } else {
538       if (MinValue < mMinMaxStepData->u16.MinValue) {
539         mMinMaxStepData->u16.MinValue = MinValue;
540       }
541       if (MaxValue > mMinMaxStepData->u16.MaxValue) {
542         mMinMaxStepData->u16.MaxValue = MaxValue;
543       }
544     }
545     mMinMaxStepData->u16.Step = Step;
546   }
547 
SetMinMaxStepData(IN UINT8 MinValue,IN UINT8 MaxValue,IN UINT8 Step)548   VOID SetMinMaxStepData (IN UINT8 MinValue, IN UINT8 MaxValue, IN UINT8 Step) {
549     if (!ValueIsSet) {
550       mMinMaxStepData->u8.MinValue = MinValue;
551       mMinMaxStepData->u8.MaxValue = MaxValue;
552       ValueIsSet = TRUE;
553     } else {
554       if (MinValue < mMinMaxStepData->u8.MinValue) {
555         mMinMaxStepData->u8.MinValue = MinValue;
556       }
557       if (MaxValue > mMinMaxStepData->u8.MaxValue) {
558         mMinMaxStepData->u8.MaxValue = MaxValue;
559       }
560     }
561     mMinMaxStepData->u8.Step = Step;
562   }
563 
GetMinData(UINT8 VarType,BOOLEAN IsBitVar)564   UINT64 GetMinData (UINT8 VarType, BOOLEAN IsBitVar) {
565     UINT64 MinValue = 0;
566     if (IsBitVar) {
567       MinValue = mMinMaxStepData->u32.MinValue;
568       return MinValue;
569     }
570     switch (VarType) {
571     case EFI_IFR_TYPE_NUM_SIZE_64:
572       MinValue = mMinMaxStepData->u64.MinValue;
573       break;
574     case EFI_IFR_TYPE_NUM_SIZE_32:
575       MinValue = (UINT64) mMinMaxStepData->u32.MinValue;
576       break;
577     case EFI_IFR_TYPE_NUM_SIZE_16:
578       MinValue = (UINT64) mMinMaxStepData->u16.MinValue;
579       break;
580     case EFI_IFR_TYPE_NUM_SIZE_8:
581       MinValue = (UINT64) mMinMaxStepData->u8.MinValue;
582       break;
583     default:
584       break;
585     }
586     return MinValue;
587   }
588 
GetMaxData(UINT8 VarType,BOOLEAN IsBitVar)589   UINT64 GetMaxData (UINT8 VarType, BOOLEAN IsBitVar) {
590     UINT64 MaxValue = 0;
591     if (IsBitVar) {
592       MaxValue = mMinMaxStepData->u32.MaxValue;
593       return MaxValue;
594     }
595     switch (VarType) {
596     case EFI_IFR_TYPE_NUM_SIZE_64:
597       MaxValue = mMinMaxStepData->u64.MaxValue;
598       break;
599     case EFI_IFR_TYPE_NUM_SIZE_32:
600       MaxValue = (UINT64) mMinMaxStepData->u32.MaxValue;
601       break;
602     case EFI_IFR_TYPE_NUM_SIZE_16:
603       MaxValue = (UINT64) mMinMaxStepData->u16.MaxValue;
604       break;
605     case EFI_IFR_TYPE_NUM_SIZE_8:
606       MaxValue = (UINT64) mMinMaxStepData->u8.MaxValue;
607       break;
608     default:
609       break;
610     }
611     return MaxValue;
612   }
613 
GetStepData(UINT8 VarType,BOOLEAN IsBitVar)614   UINT64 GetStepData (UINT8 VarType, BOOLEAN IsBitVar) {
615     UINT64 MaxValue = 0;
616     if (IsBitVar) {
617       MaxValue = mMinMaxStepData->u32.Step;
618       return MaxValue;
619     }
620     switch (VarType) {
621     case EFI_IFR_TYPE_NUM_SIZE_64:
622       MaxValue = mMinMaxStepData->u64.Step;
623       break;
624     case EFI_IFR_TYPE_NUM_SIZE_32:
625       MaxValue = (UINT64) mMinMaxStepData->u32.Step;
626       break;
627     case EFI_IFR_TYPE_NUM_SIZE_16:
628       MaxValue = (UINT64) mMinMaxStepData->u16.Step;
629       break;
630     case EFI_IFR_TYPE_NUM_SIZE_8:
631       MaxValue = (UINT64) mMinMaxStepData->u8.Step;
632       break;
633     default:
634       break;
635     }
636     return MaxValue;
637   }
638 
IsNumericOpcode()639   BOOLEAN IsNumericOpcode () {
640     return IsNumeric;
641   }
642 
UpdateCIfrMinMaxStepData(IN MINMAXSTEP_DATA * MinMaxStepData)643   VOID UpdateCIfrMinMaxStepData (IN MINMAXSTEP_DATA *MinMaxStepData) {
644     mMinMaxStepData = MinMaxStepData;
645   }
646 };
647 
648 static CIfrQuestionHeader *gCurrentQuestion  = NULL;
649 static CIfrMinMaxStepData *gCurrentMinMaxData = NULL;
650 static BOOLEAN            gIsOrderedList = FALSE;
651 static BOOLEAN            gIsStringOp = FALSE;
652 
653 /*
654  * The definition of all of the UEFI IFR Objects
655  */
656 class CIfrFormSet : public CIfrObj, public CIfrOpHeader {
657 private:
658   EFI_IFR_FORM_SET *mFormSet;
659   EFI_GUID *mClassGuid;
660 
661 public:
CIfrFormSet(UINT8 Size)662   CIfrFormSet (UINT8 Size) : CIfrObj (EFI_IFR_FORM_SET_OP, (CHAR8 **)NULL, Size),
663                    CIfrOpHeader (EFI_IFR_FORM_SET_OP, &(GetObjBinAddr<EFI_IFR_FORM_SET>())->Header, Size), mFormSet(GetObjBinAddr<EFI_IFR_FORM_SET>()) {
664     mFormSet->Help         = EFI_STRING_ID_INVALID;
665     mFormSet->FormSetTitle = EFI_STRING_ID_INVALID;
666     mFormSet->Flags        = 0;
667     memset (&mFormSet->Guid, 0, sizeof (EFI_GUID));
668     mClassGuid = (EFI_GUID *) (mFormSet + 1);
669   }
670 
SetGuid(IN EFI_GUID * Guid)671   VOID SetGuid (IN EFI_GUID *Guid) {
672     memmove (&mFormSet->Guid, Guid, sizeof (EFI_GUID));
673   }
674 
SetFormSetTitle(IN EFI_STRING_ID FormSetTitle)675   VOID SetFormSetTitle (IN EFI_STRING_ID FormSetTitle) {
676     mFormSet->FormSetTitle = FormSetTitle;
677   }
678 
SetHelp(IN EFI_STRING_ID Help)679   VOID SetHelp (IN EFI_STRING_ID Help) {
680     mFormSet->Help = Help;
681   }
682 
SetClassGuid(IN EFI_GUID * Guid)683   VOID SetClassGuid (IN EFI_GUID *Guid) {
684     memmove (&(mClassGuid[mFormSet->Flags++]), Guid, sizeof (EFI_GUID));
685   }
686 
GetFlags()687   UINT8 GetFlags() {
688     return mFormSet->Flags;
689   }
690 };
691 
692 class CIfrEnd : public CIfrObj, public CIfrOpHeader {
693 public:
CIfrEnd()694   CIfrEnd () : CIfrObj (EFI_IFR_END_OP),
695                CIfrOpHeader (EFI_IFR_END_OP, &(GetObjBinAddr<EFI_IFR_END>())->Header) {}
696 };
697 
698 class CIfrDefaultStore : public CIfrObj, public CIfrOpHeader {
699 private:
700   EFI_IFR_DEFAULTSTORE *mDefaultStore;
701 
702 public:
CIfrDefaultStore()703   CIfrDefaultStore () : CIfrObj (EFI_IFR_DEFAULTSTORE_OP),
704                        CIfrOpHeader (EFI_IFR_DEFAULTSTORE_OP, &(GetObjBinAddr<EFI_IFR_DEFAULTSTORE>())->Header), mDefaultStore(GetObjBinAddr<EFI_IFR_DEFAULTSTORE>()) {
705     mDefaultStore->DefaultId   = EFI_VARSTORE_ID_INVALID;
706     mDefaultStore->DefaultName = EFI_STRING_ID_INVALID;
707   }
708 
SetDefaultName(IN EFI_STRING_ID DefaultName)709   VOID SetDefaultName (IN EFI_STRING_ID DefaultName) {
710     mDefaultStore->DefaultName = DefaultName;
711   }
712 
SetDefaultId(IN UINT16 DefaultId)713   VOID SetDefaultId (IN UINT16 DefaultId) {
714     mDefaultStore->DefaultId = DefaultId;
715   }
716 };
717 
718 #define EFI_FORM_ID_MAX                    0xFFFF
719 #define EFI_FREE_FORM_ID_BITMAP_SIZE     ((EFI_FORM_ID_MAX + 1) / EFI_BITS_PER_UINT32)
720 
721 class CIfrFormId {
722 public:
723   STATIC UINT32 FormIdBitMap[EFI_FREE_FORM_ID_BITMAP_SIZE];
724 
ChekFormIdFree(IN EFI_FORM_ID FormId)725   STATIC BOOLEAN ChekFormIdFree (IN EFI_FORM_ID FormId) {
726     UINT32 Index  = (FormId / EFI_BITS_PER_UINT32);
727     UINT32 Offset = (FormId % EFI_BITS_PER_UINT32);
728 
729     return (FormIdBitMap[Index] & (0x80000000 >> Offset)) == 0;
730   }
731 
MarkFormIdUsed(IN EFI_FORM_ID FormId)732   STATIC VOID MarkFormIdUsed (IN EFI_FORM_ID FormId) {
733     UINT32 Index  = (FormId / EFI_BITS_PER_UINT32);
734     UINT32 Offset = (FormId % EFI_BITS_PER_UINT32);
735 
736     FormIdBitMap[Index] |= (0x80000000 >> Offset);
737   }
738 };
739 
740 class CIfrForm : public CIfrObj, public CIfrOpHeader {
741 private:
742   EFI_IFR_FORM  *mForm;
743 
744 public:
CIfrForm()745   CIfrForm () : CIfrObj (EFI_IFR_FORM_OP),
746                 CIfrOpHeader (EFI_IFR_FORM_OP, &(GetObjBinAddr<EFI_IFR_FORM>())->Header), mForm(GetObjBinAddr<EFI_IFR_FORM>()) {
747     mForm->FormId    = 0;
748     mForm->FormTitle = EFI_STRING_ID_INVALID;
749   }
750 
SetFormId(IN EFI_FORM_ID FormId)751   EFI_VFR_RETURN_CODE SetFormId (IN EFI_FORM_ID FormId) {
752     if (FormId == 0) {
753       //
754       // FormId can't be 0.
755       //
756       return VFR_RETURN_INVALID_PARAMETER;
757     }
758     if (CIfrFormId::ChekFormIdFree (FormId) == FALSE) {
759       return VFR_RETURN_FORMID_REDEFINED;
760     }
761     mForm->FormId = FormId;
762     CIfrFormId::MarkFormIdUsed (FormId);
763     return VFR_RETURN_SUCCESS;
764   }
765 
SetFormTitle(IN EFI_STRING_ID FormTitle)766   VOID SetFormTitle (IN EFI_STRING_ID FormTitle) {
767     mForm->FormTitle = FormTitle;
768   }
769 };
770 
771 class CIfrFormMap : public CIfrObj, public CIfrOpHeader {
772 private:
773   EFI_IFR_FORM_MAP        *mFormMap;
774   EFI_IFR_FORM_MAP_METHOD *mMethodMap;
775 
776 public:
CIfrFormMap()777   CIfrFormMap () : CIfrObj (EFI_IFR_FORM_MAP_OP, (CHAR8 **)NULL, sizeof (EFI_IFR_FORM_MAP), TRUE),
778                    CIfrOpHeader (EFI_IFR_FORM_MAP_OP, &(GetObjBinAddr<EFI_IFR_FORM_MAP>())->Header), mFormMap(GetObjBinAddr<EFI_IFR_FORM_MAP>()) {
779     mFormMap->FormId = 0;
780     mMethodMap       = (EFI_IFR_FORM_MAP_METHOD *) (mFormMap + 1);
781   }
782 
SetFormId(IN EFI_FORM_ID FormId)783   EFI_VFR_RETURN_CODE SetFormId (IN EFI_FORM_ID FormId) {
784     if (FormId == 0) {
785       //
786       // FormId can't be 0.
787       //
788       return VFR_RETURN_INVALID_PARAMETER;
789     }
790     if (CIfrFormId::ChekFormIdFree (FormId) == FALSE) {
791       return VFR_RETURN_FORMID_REDEFINED;
792     }
793     mFormMap->FormId = FormId;
794     CIfrFormId::MarkFormIdUsed (FormId);
795     return VFR_RETURN_SUCCESS;
796   }
797 
SetFormMapMethod(IN EFI_STRING_ID MethodTitle,IN EFI_GUID * MethodGuid)798   VOID SetFormMapMethod (IN EFI_STRING_ID MethodTitle, IN EFI_GUID *MethodGuid) {
799     if (ExpendObjBin (sizeof (EFI_IFR_FORM_MAP_METHOD))) {
800       IncLength (sizeof (EFI_IFR_FORM_MAP_METHOD));
801 
802       mMethodMap->MethodTitle = MethodTitle;
803       memmove (&(mMethodMap->MethodIdentifier), MethodGuid, sizeof (EFI_GUID));
804       mMethodMap ++;
805     }
806   }
807 };
808 
809 class CIfrVarStore : public CIfrObj, public CIfrOpHeader {
810 private:
811   EFI_IFR_VARSTORE *mVarStore;
812 
813 public:
CIfrVarStore()814   CIfrVarStore () : CIfrObj (EFI_IFR_VARSTORE_OP, (CHAR8 **)NULL, sizeof (EFI_IFR_VARSTORE), TRUE),
815                    CIfrOpHeader (EFI_IFR_VARSTORE_OP, &(GetObjBinAddr<EFI_IFR_VARSTORE>())->Header), mVarStore(GetObjBinAddr<EFI_IFR_VARSTORE>()) {
816     mVarStore->VarStoreId = EFI_VARSTORE_ID_INVALID;
817     mVarStore->Size       = 0;
818     memset (&mVarStore->Guid, 0, sizeof (EFI_GUID));
819     mVarStore->Name[0]    = '\0';
820   }
821 
SetGuid(IN EFI_GUID * Guid)822   VOID SetGuid (IN EFI_GUID *Guid) {
823     memmove (&mVarStore->Guid, Guid, sizeof (EFI_GUID));
824   }
825 
SetVarStoreId(IN EFI_VARSTORE_ID VarStoreId)826   VOID SetVarStoreId (IN EFI_VARSTORE_ID VarStoreId) {
827     mVarStore->VarStoreId = VarStoreId;
828   }
829 
SetSize(IN UINT16 Size)830   VOID SetSize (IN UINT16 Size) {
831     mVarStore->Size = Size;
832   }
833 
SetName(IN CHAR8 * Name)834   VOID SetName (IN CHAR8 *Name) {
835     UINT8 Len;
836 
837     if (Name != NULL) {
838       Len = (UINT8) strlen (Name);
839       if (Len != 0) {
840         if (ExpendObjBin (Len) == TRUE) {
841           IncLength (Len);
842           strcpy ((CHAR8 *)(mVarStore->Name), Name);
843         }
844       }
845     }
846   }
847 };
848 
849 class CIfrVarStoreEfi : public CIfrObj, public CIfrOpHeader {
850 private:
851   EFI_IFR_VARSTORE_EFI *mVarStoreEfi;
852 
853 public:
CIfrVarStoreEfi()854   CIfrVarStoreEfi () : CIfrObj (EFI_IFR_VARSTORE_EFI_OP, (CHAR8 **)NULL, sizeof (EFI_IFR_VARSTORE_EFI), TRUE),
855                       CIfrOpHeader (EFI_IFR_VARSTORE_EFI_OP, &(GetObjBinAddr<EFI_IFR_VARSTORE_EFI>())->Header), mVarStoreEfi(GetObjBinAddr<EFI_IFR_VARSTORE_EFI>()) {
856     mVarStoreEfi->VarStoreId = EFI_VAROFFSET_INVALID;
857     mVarStoreEfi->Size       = 0;
858     memset (&mVarStoreEfi->Guid, 0, sizeof (EFI_GUID));
859     mVarStoreEfi->Name[0]    = '\0';
860   }
861 
SetGuid(IN EFI_GUID * Guid)862   VOID SetGuid (IN EFI_GUID *Guid) {
863     memmove (&mVarStoreEfi->Guid, Guid, sizeof (EFI_GUID));
864   }
865 
SetVarStoreId(IN UINT16 VarStoreId)866   VOID SetVarStoreId (IN UINT16 VarStoreId) {
867     mVarStoreEfi->VarStoreId = VarStoreId;
868   }
869 
SetAttributes(IN UINT32 Attributes)870   VOID SetAttributes (IN UINT32 Attributes) {
871     mVarStoreEfi->Attributes = Attributes;
872   }
SetSize(IN UINT16 Size)873   VOID SetSize (IN UINT16 Size) {
874     mVarStoreEfi->Size = Size;
875   }
876 
SetName(IN CHAR8 * Name)877   VOID SetName (IN CHAR8 *Name) {
878     UINT8 Len;
879 
880     if (Name != NULL) {
881       Len = (UINT8) strlen (Name);
882       if (Len != 0) {
883         if (ExpendObjBin (Len) == TRUE) {
884           IncLength (Len);
885           strcpy ((CHAR8 *)(mVarStoreEfi->Name), Name);
886         }
887       }
888     }
889   }
890 
SetBinaryLength(IN UINT16 Size)891   VOID SetBinaryLength (IN UINT16 Size) {
892     UINT16 Len;
893 
894     Len = sizeof (EFI_IFR_VARSTORE_EFI);
895     if (Size > Len) {
896       ExpendObjBin(Size - Len);
897       IncLength(Size - Len);
898     } else {
899       ShrinkObjBin(Len - Size);
900       DecLength(Len - Size);
901     }
902   }
903 };
904 
905 class CIfrVarStoreNameValue : public CIfrObj, public CIfrOpHeader {
906 private:
907   EFI_IFR_VARSTORE_NAME_VALUE *mVarStoreNameValue;
908 
909 public:
CIfrVarStoreNameValue()910   CIfrVarStoreNameValue () : CIfrObj (EFI_IFR_VARSTORE_NAME_VALUE_OP),
911                               CIfrOpHeader (EFI_IFR_VARSTORE_NAME_VALUE_OP, &(GetObjBinAddr<EFI_IFR_VARSTORE_NAME_VALUE>())->Header), mVarStoreNameValue(GetObjBinAddr<EFI_IFR_VARSTORE_NAME_VALUE>()) {
912     mVarStoreNameValue->VarStoreId = EFI_VAROFFSET_INVALID;
913     memset (&mVarStoreNameValue->Guid, 0, sizeof (EFI_GUID));
914   }
915 
SetGuid(IN EFI_GUID * Guid)916   VOID SetGuid (IN EFI_GUID *Guid) {
917     memmove (&mVarStoreNameValue->Guid, Guid, sizeof (EFI_GUID));
918   }
919 
SetVarStoreId(IN UINT16 VarStoreId)920   VOID SetVarStoreId (IN UINT16 VarStoreId) {
921     mVarStoreNameValue->VarStoreId = VarStoreId;
922   }
923 };
924 
925 class CIfrImage : public CIfrObj, public CIfrOpHeader {
926 private:
927   EFI_IFR_IMAGE *mImage;
928 
929 public:
CIfrImage()930   CIfrImage () : CIfrObj (EFI_IFR_IMAGE_OP),
931                  CIfrOpHeader (EFI_IFR_IMAGE_OP, &(GetObjBinAddr<EFI_IFR_IMAGE>())->Header), mImage(GetObjBinAddr<EFI_IFR_IMAGE>()) {
932     mImage->Id = EFI_IMAGE_ID_INVALID;
933   }
934 
SetImageId(IN EFI_IMAGE_ID ImageId)935   VOID SetImageId (IN EFI_IMAGE_ID ImageId) {
936     mImage->Id = ImageId;
937   }
938 };
939 
940 class CIfrModal : public CIfrObj, public CIfrOpHeader {
941 public:
CIfrModal()942   CIfrModal () : CIfrObj (EFI_IFR_MODAL_TAG_OP),
943                  CIfrOpHeader (EFI_IFR_MODAL_TAG_OP, &(GetObjBinAddr<EFI_IFR_MODAL_TAG>())->Header) {
944   }
945 };
946 
947 
948 class CIfrLocked : public CIfrObj, public CIfrOpHeader {
949 public:
CIfrLocked()950   CIfrLocked () : CIfrObj (EFI_IFR_LOCKED_OP),
951                   CIfrOpHeader (EFI_IFR_LOCKED_OP, &(GetObjBinAddr<EFI_IFR_LOCKED>())->Header) {}
952 };
953 
954 class CIfrRule : public CIfrObj, public CIfrOpHeader {
955 private:
956   EFI_IFR_RULE *mRule;
957 
958 public:
CIfrRule()959   CIfrRule () : CIfrObj (EFI_IFR_RULE_OP),
960                 CIfrOpHeader (EFI_IFR_RULE_OP, &(GetObjBinAddr<EFI_IFR_RULE>())->Header), mRule(GetObjBinAddr<EFI_IFR_RULE>()) {
961     mRule->RuleId = EFI_RULE_ID_INVALID;
962   }
963 
SetRuleId(IN UINT8 RuleId)964   VOID SetRuleId (IN UINT8 RuleId) {
965     mRule->RuleId = RuleId;
966   }
967 };
968 
969 static EFI_IFR_TYPE_VALUE gZeroEfiIfrTypeValue = {0, };
970 
971 class CIfrDefault : public CIfrObj, public CIfrOpHeader {
972 private:
973   EFI_IFR_DEFAULT *mDefault;
974 
975 public:
976   CIfrDefault (
977     IN UINT8              Size,
978     IN UINT16             DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD,
979     IN UINT8              Type      = EFI_IFR_TYPE_OTHER,
980     IN EFI_IFR_TYPE_VALUE Value     = gZeroEfiIfrTypeValue
981     ) : CIfrObj (EFI_IFR_DEFAULT_OP, (CHAR8 **)NULL, Size),
982         CIfrOpHeader (EFI_IFR_DEFAULT_OP, &(GetObjBinAddr<EFI_IFR_DEFAULT>())->Header, Size), mDefault(GetObjBinAddr<EFI_IFR_DEFAULT>()) {
983     mDefault->Type      = Type;
984     mDefault->DefaultId = DefaultId;
985     memmove (&(mDefault->Value), &Value, Size - OFFSET_OF (EFI_IFR_DEFAULT, Value));
986   }
987 
SetDefaultId(IN UINT16 DefaultId)988   VOID SetDefaultId (IN UINT16 DefaultId) {
989     mDefault->DefaultId = DefaultId;
990   }
991 
SetType(IN UINT8 Type)992   VOID SetType (IN UINT8 Type) {
993     mDefault->Type = Type;
994   }
995 
SetValue(IN EFI_IFR_TYPE_VALUE Value)996   VOID SetValue (IN EFI_IFR_TYPE_VALUE Value) {
997     memmove (&mDefault->Value, &Value, mDefault->Header.Length - OFFSET_OF (EFI_IFR_DEFAULT, Value));
998   }
999 };
1000 
1001 class CIfrDefault2 : public CIfrObj, public CIfrOpHeader {
1002 private:
1003   EFI_IFR_DEFAULT_2 *mDefault;
1004 
1005 public:
1006   CIfrDefault2 (
1007     IN UINT16             DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD,
1008     IN UINT8              Type      = EFI_IFR_TYPE_OTHER
1009     ) : CIfrObj (EFI_IFR_DEFAULT_OP, (CHAR8 **)NULL, sizeof (EFI_IFR_DEFAULT_2)),
1010         CIfrOpHeader (EFI_IFR_DEFAULT_OP, &(GetObjBinAddr<EFI_IFR_DEFAULT_2>())->Header, sizeof (EFI_IFR_DEFAULT_2)), mDefault(GetObjBinAddr<EFI_IFR_DEFAULT_2>()) {
1011     mDefault->Type      = Type;
1012     mDefault->DefaultId = DefaultId;
1013   }
1014 
SetDefaultId(IN UINT16 DefaultId)1015   VOID SetDefaultId (IN UINT16 DefaultId) {
1016     mDefault->DefaultId = DefaultId;
1017   }
1018 
SetType(IN UINT8 Type)1019   VOID SetType (IN UINT8 Type) {
1020     mDefault->Type = Type;
1021   }
1022 };
1023 
1024 class CIfrValue : public CIfrObj, public CIfrOpHeader{
1025 public:
CIfrValue()1026   CIfrValue () : CIfrObj (EFI_IFR_VALUE_OP),
1027                 CIfrOpHeader (EFI_IFR_VALUE_OP, &(GetObjBinAddr<EFI_IFR_VALUE>())->Header) {}
1028 
1029 };
1030 
1031 class CIfrRead : public CIfrObj, public CIfrOpHeader{
1032 public:
CIfrRead()1033   CIfrRead () : CIfrObj (EFI_IFR_READ_OP),
1034                 CIfrOpHeader (EFI_IFR_READ_OP, &(GetObjBinAddr<EFI_IFR_READ>())->Header) {}
1035 
1036 };
1037 
1038 class CIfrWrite : public CIfrObj, public CIfrOpHeader{
1039 public:
CIfrWrite()1040   CIfrWrite () : CIfrObj (EFI_IFR_WRITE_OP),
1041                 CIfrOpHeader (EFI_IFR_WRITE_OP, &(GetObjBinAddr<EFI_IFR_WRITE>())->Header) {}
1042 
1043 };
1044 
1045 class CIfrGet : public CIfrObj, public CIfrOpHeader{
1046 private:
1047   EFI_IFR_GET *mGet;
1048 
1049 public:
CIfrGet(IN UINT32 LineNo)1050   CIfrGet (
1051   IN UINT32 LineNo
1052   ) : CIfrObj (EFI_IFR_GET_OP),
1053       CIfrOpHeader (EFI_IFR_GET_OP, &(GetObjBinAddr<EFI_IFR_GET>())->Header), mGet(GetObjBinAddr<EFI_IFR_GET>()) {
1054     SetLineNo (LineNo);
1055   }
1056 
SetVarInfo(IN EFI_VARSTORE_INFO * Info)1057   VOID SetVarInfo (IN EFI_VARSTORE_INFO *Info) {
1058     mGet->VarStoreId             = Info->mVarStoreId;
1059     mGet->VarStoreInfo.VarName   = Info->mInfo.mVarName;
1060     mGet->VarStoreInfo.VarOffset = Info->mInfo.mVarOffset;
1061     mGet->VarStoreType           = Info->mVarType;
1062   }
1063 };
1064 
1065 class CIfrSet : public CIfrObj, public CIfrOpHeader{
1066 private:
1067   EFI_IFR_SET *mSet;
1068 
1069 public:
CIfrSet(IN UINT32 LineNo)1070   CIfrSet (
1071   IN UINT32 LineNo
1072   ) : CIfrObj (EFI_IFR_SET_OP),
1073       CIfrOpHeader (EFI_IFR_SET_OP, &(GetObjBinAddr<EFI_IFR_SET>())->Header), mSet(GetObjBinAddr<EFI_IFR_SET>()) {
1074     SetLineNo (LineNo);
1075   }
1076 
SetVarInfo(IN EFI_VARSTORE_INFO * Info)1077   VOID SetVarInfo (IN EFI_VARSTORE_INFO *Info) {
1078     mSet->VarStoreId             = Info->mVarStoreId;
1079     mSet->VarStoreInfo.VarName   = Info->mInfo.mVarName;
1080     mSet->VarStoreInfo.VarOffset = Info->mInfo.mVarOffset;
1081     mSet->VarStoreType           = Info->mVarType;
1082   }
1083 };
1084 
1085 class CIfrSubtitle : public CIfrObj, public CIfrOpHeader, public CIfrStatementHeader {
1086 private:
1087   EFI_IFR_SUBTITLE   *mSubtitle;
1088 
1089 public:
CIfrSubtitle()1090   CIfrSubtitle () : CIfrObj (EFI_IFR_SUBTITLE_OP),
1091                   CIfrOpHeader (EFI_IFR_SUBTITLE_OP, &(GetObjBinAddr<EFI_IFR_SUBTITLE>())->Header),
1092   CIfrStatementHeader (&(GetObjBinAddr<EFI_IFR_SUBTITLE>())->Statement), mSubtitle(GetObjBinAddr<EFI_IFR_SUBTITLE>()) {
1093     mSubtitle->Flags = 0;
1094   }
1095 
SetFlags(IN UINT8 LFlags)1096   EFI_VFR_RETURN_CODE SetFlags (IN UINT8 LFlags) {
1097     if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_IFR_FLAGS_HORIZONTAL)) {
1098       mSubtitle->Flags |= EFI_IFR_FLAGS_HORIZONTAL;
1099     }
1100 
1101     return _FLAGS_ZERO (LFlags) ? VFR_RETURN_SUCCESS : VFR_RETURN_FLAGS_UNSUPPORTED;
1102   }
1103 };
1104 
1105 class CIfrText : public CIfrObj, public CIfrOpHeader, public CIfrStatementHeader {
1106 private:
1107   EFI_IFR_TEXT *mText;
1108 
1109 public:
CIfrText()1110   CIfrText () : CIfrObj (EFI_IFR_TEXT_OP),
1111                CIfrOpHeader (EFI_IFR_TEXT_OP, &(GetObjBinAddr<EFI_IFR_TEXT>())->Header),
1112                CIfrStatementHeader (&(GetObjBinAddr<EFI_IFR_TEXT>())->Statement), mText(GetObjBinAddr<EFI_IFR_TEXT>()) {
1113     mText->TextTwo = EFI_STRING_ID_INVALID;
1114   }
1115 
SetTextTwo(IN EFI_STRING_ID StringId)1116   VOID SetTextTwo (IN EFI_STRING_ID StringId) {
1117     mText->TextTwo = StringId;
1118   }
1119 };
1120 
1121 class CIfrRef : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {
1122 private:
1123   EFI_IFR_REF *mRef;
1124 
1125 public:
CIfrRef()1126   CIfrRef () : CIfrObj (EFI_IFR_REF_OP),
1127               CIfrOpHeader (EFI_IFR_REF_OP, &(GetObjBinAddr<EFI_IFR_REF>())->Header),
1128               CIfrQuestionHeader (&(GetObjBinAddr<EFI_IFR_REF>())->Question), mRef(GetObjBinAddr<EFI_IFR_REF>()) {
1129     mRef->FormId = 0;
1130   }
1131 
SetFormId(IN EFI_FORM_ID FormId)1132   VOID SetFormId (IN EFI_FORM_ID FormId) {
1133     mRef->FormId = FormId;
1134   }
1135 };
1136 
1137 class CIfrRef2 : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {
1138 private:
1139   EFI_IFR_REF2 *mRef2;
1140 
1141 public:
CIfrRef2()1142   CIfrRef2 () : CIfrObj (EFI_IFR_REF_OP, (CHAR8 **)NULL, sizeof (EFI_IFR_REF2)),
1143                CIfrOpHeader (EFI_IFR_REF_OP, &(GetObjBinAddr<EFI_IFR_REF2>())->Header, sizeof (EFI_IFR_REF2)),
1144                CIfrQuestionHeader (&(GetObjBinAddr<EFI_IFR_REF2>())->Question), mRef2(GetObjBinAddr<EFI_IFR_REF2>()) {
1145     mRef2->FormId     = 0;
1146     mRef2->QuestionId = EFI_QUESTION_ID_INVALID;
1147   }
1148 
SetFormId(IN EFI_FORM_ID FormId)1149   VOID SetFormId (IN EFI_FORM_ID FormId) {
1150     mRef2->FormId = FormId;
1151   }
1152 
SetQuestionId(IN EFI_QUESTION_ID QuestionId)1153   VOID SetQuestionId (IN EFI_QUESTION_ID QuestionId) {
1154     mRef2->QuestionId = QuestionId;
1155   }
1156 };
1157 
1158 class CIfrRef3 : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {
1159 private:
1160   EFI_IFR_REF3 *mRef3;
1161 
1162 public:
CIfrRef3()1163   CIfrRef3 () : CIfrObj (EFI_IFR_REF_OP, (CHAR8 **)NULL, sizeof(EFI_IFR_REF3)),
1164                CIfrOpHeader (EFI_IFR_REF_OP, &(GetObjBinAddr<EFI_IFR_REF3>())->Header, sizeof (EFI_IFR_REF3)),
1165                CIfrQuestionHeader (&(GetObjBinAddr<EFI_IFR_REF3>())->Question), mRef3(GetObjBinAddr<EFI_IFR_REF3>()) {
1166     mRef3->FormId     = 0;
1167     mRef3->QuestionId = EFI_QUESTION_ID_INVALID;
1168     memset (&mRef3->FormSetId, 0, sizeof (EFI_GUID));
1169   }
1170 
SetFormId(IN EFI_FORM_ID FormId)1171   VOID SetFormId (IN EFI_FORM_ID FormId) {
1172     mRef3->FormId = FormId;
1173   }
1174 
SetQuestionId(IN EFI_QUESTION_ID QuestionId)1175   VOID SetQuestionId (IN EFI_QUESTION_ID QuestionId) {
1176     mRef3->QuestionId = QuestionId;
1177   }
1178 
SetFormSetId(IN EFI_GUID FormSetId)1179   VOID SetFormSetId (IN EFI_GUID FormSetId) {
1180     mRef3->FormSetId = FormSetId;
1181   }
1182 };
1183 
1184 class CIfrRef4 : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {
1185 private:
1186   EFI_IFR_REF4 *mRef4;
1187 
1188 public:
CIfrRef4()1189   CIfrRef4 () : CIfrObj (EFI_IFR_REF_OP, (CHAR8 **)NULL, sizeof(EFI_IFR_REF4)),
1190                CIfrOpHeader (EFI_IFR_REF_OP, &(GetObjBinAddr<EFI_IFR_REF4>())->Header, sizeof(EFI_IFR_REF4)),
1191                CIfrQuestionHeader (&(GetObjBinAddr<EFI_IFR_REF4>())->Question), mRef4(GetObjBinAddr<EFI_IFR_REF4>()) {
1192     mRef4->FormId     = 0;
1193     mRef4->QuestionId = EFI_QUESTION_ID_INVALID;
1194     memset (&mRef4->FormSetId, 0, sizeof (EFI_GUID));
1195     mRef4->DevicePath = EFI_STRING_ID_INVALID;
1196   }
1197 
SetFormId(IN EFI_FORM_ID FormId)1198   VOID SetFormId (IN EFI_FORM_ID FormId) {
1199     mRef4->FormId = FormId;
1200   }
1201 
SetQuestionId(IN EFI_QUESTION_ID QuestionId)1202   VOID SetQuestionId (IN EFI_QUESTION_ID QuestionId) {
1203     mRef4->QuestionId = QuestionId;
1204   }
1205 
SetFormSetId(IN EFI_GUID FormSetId)1206   VOID SetFormSetId (IN EFI_GUID FormSetId) {
1207     mRef4->FormSetId = FormSetId;
1208   }
1209 
SetDevicePath(IN EFI_STRING_ID DevicePath)1210   VOID SetDevicePath (IN EFI_STRING_ID DevicePath) {
1211     mRef4->DevicePath = DevicePath;
1212   }
1213 };
1214 
1215 class CIfrRef5 : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {
1216 public:
CIfrRef5()1217   CIfrRef5 () : CIfrObj (EFI_IFR_REF_OP, (CHAR8 **)NULL, sizeof (EFI_IFR_REF5)),
1218               CIfrOpHeader (EFI_IFR_REF_OP, &(GetObjBinAddr<EFI_IFR_REF5>())->Header, sizeof (EFI_IFR_REF5)),
1219               CIfrQuestionHeader (&(GetObjBinAddr<EFI_IFR_REF5>())->Question) {
1220   }
1221 };
1222 
1223 class CIfrResetButton : public CIfrObj, public CIfrOpHeader, public CIfrStatementHeader {
1224 private:
1225   EFI_IFR_RESET_BUTTON *mResetButton;
1226 
1227 public:
CIfrResetButton()1228   CIfrResetButton () : CIfrObj (EFI_IFR_RESET_BUTTON_OP),
1229                        CIfrOpHeader (EFI_IFR_RESET_BUTTON_OP, &(GetObjBinAddr<EFI_IFR_RESET_BUTTON>())->Header),
1230   CIfrStatementHeader (&(GetObjBinAddr<EFI_IFR_RESET_BUTTON>())->Statement), mResetButton(GetObjBinAddr<EFI_IFR_RESET_BUTTON>()) {
1231     mResetButton->DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;
1232   }
1233 
SetDefaultId(IN UINT16 DefaultId)1234   VOID SetDefaultId (IN UINT16 DefaultId) {
1235     mResetButton->DefaultId = DefaultId;
1236   }
1237 };
1238 
1239 class CIfrCheckBox : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader  {
1240 private:
1241   EFI_IFR_CHECKBOX *mCheckBox;
1242 
1243 public:
CIfrCheckBox()1244   CIfrCheckBox () : CIfrObj (EFI_IFR_CHECKBOX_OP),
1245                      CIfrOpHeader (EFI_IFR_CHECKBOX_OP, &(GetObjBinAddr<EFI_IFR_CHECKBOX>())->Header),
1246                      CIfrQuestionHeader (&(GetObjBinAddr<EFI_IFR_CHECKBOX>())->Question), mCheckBox(GetObjBinAddr<EFI_IFR_CHECKBOX>()) {
1247     mCheckBox->Flags = 0;
1248     gCurrentQuestion  = this;
1249   }
1250 
~CIfrCheckBox()1251   ~CIfrCheckBox () {
1252     gCurrentQuestion  = NULL;
1253   }
1254 
SetFlags(IN UINT8 HFlags,UINT8 LFlags)1255   EFI_VFR_RETURN_CODE SetFlags (IN UINT8 HFlags, UINT8 LFlags) {
1256     EFI_VFR_RETURN_CODE Ret;
1257 
1258     Ret = CIfrQuestionHeader::SetFlags (HFlags);
1259     if (Ret != VFR_RETURN_SUCCESS) {
1260       return Ret;
1261     }
1262 
1263     if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_IFR_CHECKBOX_DEFAULT)) {
1264       mCheckBox->Flags |= EFI_IFR_CHECKBOX_DEFAULT;
1265     }
1266 
1267     if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_IFR_CHECKBOX_DEFAULT_MFG)) {
1268       mCheckBox->Flags |= EFI_IFR_CHECKBOX_DEFAULT_MFG;
1269     }
1270 
1271     return _FLAGS_ZERO (LFlags) ? VFR_RETURN_SUCCESS : VFR_RETURN_FLAGS_UNSUPPORTED;
1272   }
1273 
GetFlags(VOID)1274   UINT8 GetFlags (VOID) {
1275     return mCheckBox->Flags;
1276   }
1277 };
1278 
1279 class CIfrAction : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {
1280 private:
1281   EFI_IFR_ACTION *mAction;
1282 
1283 public:
CIfrAction()1284   CIfrAction () : CIfrObj (EFI_IFR_ACTION_OP),
1285                  CIfrOpHeader (EFI_IFR_ACTION_OP, &(GetObjBinAddr<EFI_IFR_ACTION>())->Header),
1286                  CIfrQuestionHeader (&(GetObjBinAddr<EFI_IFR_ACTION>())->Question), mAction(GetObjBinAddr<EFI_IFR_ACTION>()) {
1287     mAction->QuestionConfig = EFI_STRING_ID_INVALID;
1288   }
1289 
SetQuestionConfig(IN EFI_STRING_ID QuestionConfig)1290   VOID SetQuestionConfig (IN EFI_STRING_ID QuestionConfig) {
1291     mAction->QuestionConfig = QuestionConfig;
1292   }
1293 };
1294 
1295 class CIfrDate : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {
1296 private:
1297   EFI_IFR_DATE *mDate;
1298 
1299 public:
CIfrDate()1300   CIfrDate () : CIfrObj (EFI_IFR_DATE_OP),
1301                CIfrOpHeader (EFI_IFR_DATE_OP, &(GetObjBinAddr<EFI_IFR_DATE>())->Header),
1302                CIfrQuestionHeader (&(GetObjBinAddr<EFI_IFR_DATE>())->Question), mDate(GetObjBinAddr<EFI_IFR_DATE>()) {
1303     mDate->Flags = 0;
1304   }
1305 
SetFlags(IN UINT8 HFlags,IN UINT8 LFlags)1306   EFI_VFR_RETURN_CODE SetFlags (IN UINT8 HFlags, IN UINT8 LFlags) {
1307     EFI_VFR_RETURN_CODE Ret;
1308 
1309     Ret = CIfrQuestionHeader::SetFlags (HFlags);
1310     if (Ret != VFR_RETURN_SUCCESS) {
1311       return Ret;
1312     }
1313 
1314     if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_QF_DATE_YEAR_SUPPRESS)) {
1315       mDate->Flags |= EFI_QF_DATE_YEAR_SUPPRESS;
1316     }
1317 
1318     if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_QF_DATE_MONTH_SUPPRESS)) {
1319       mDate->Flags |= EFI_QF_DATE_MONTH_SUPPRESS;
1320     }
1321 
1322     if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_QF_DATE_DAY_SUPPRESS)) {
1323       mDate->Flags |= EFI_QF_DATE_DAY_SUPPRESS;
1324     }
1325 
1326     if (_FLAG_TEST_AND_CLEAR (LFlags, QF_DATE_STORAGE_NORMAL)) {
1327       mDate->Flags |= QF_DATE_STORAGE_NORMAL;
1328     } else if (_FLAG_TEST_AND_CLEAR (LFlags, QF_DATE_STORAGE_TIME)) {
1329       mDate->Flags |= QF_DATE_STORAGE_TIME;
1330     } else if (_FLAG_TEST_AND_CLEAR (LFlags, QF_DATE_STORAGE_WAKEUP)) {
1331       mDate->Flags |= QF_DATE_STORAGE_WAKEUP;
1332     }
1333 
1334     return _FLAGS_ZERO (LFlags) ? VFR_RETURN_SUCCESS : VFR_RETURN_FLAGS_UNSUPPORTED;
1335   }
1336 };
1337 
1338 class CIfrNumeric : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader, public CIfrMinMaxStepData {
1339 private:
1340   EFI_IFR_NUMERIC *mNumeric;
1341 
1342 public:
CIfrNumeric()1343   CIfrNumeric () : CIfrObj (EFI_IFR_NUMERIC_OP, (CHAR8 **)NULL, sizeof (EFI_IFR_NUMERIC), TRUE),
1344                    CIfrOpHeader (EFI_IFR_NUMERIC_OP, &(GetObjBinAddr<EFI_IFR_NUMERIC>())->Header),
1345                    CIfrQuestionHeader (&(GetObjBinAddr<EFI_IFR_NUMERIC>())->Question),
1346                    CIfrMinMaxStepData (&(GetObjBinAddr<EFI_IFR_NUMERIC>())->data, TRUE), mNumeric(GetObjBinAddr<EFI_IFR_NUMERIC>()) {
1347     mNumeric->Flags  = EFI_IFR_NUMERIC_SIZE_1 | EFI_IFR_DISPLAY_UINT_DEC;
1348     gCurrentQuestion   = this;
1349     gCurrentMinMaxData = this;
1350   }
1351 
~CIfrNumeric()1352   ~CIfrNumeric () {
1353     gCurrentQuestion   = NULL;
1354     gCurrentMinMaxData = NULL;
1355   }
1356 
ShrinkBinSize(IN UINT16 Size)1357   VOID ShrinkBinSize (IN UINT16 Size) {
1358     //
1359     // Update the buffer size which is truly be used later.
1360     //
1361     ShrinkObjBin(Size);
1362     DecLength(Size);
1363 
1364     //
1365     // Allocate buffer in gCFormPkg.
1366     //
1367     _EMIT_PENDING_OBJ();
1368 
1369     //
1370     // Update the buffer pointer used by other class.
1371     //
1372     mNumeric = GetObjBinAddr<EFI_IFR_NUMERIC>();
1373     UpdateHeader (&mNumeric->Header);
1374     UpdateCIfrQuestionHeader(&mNumeric->Question);
1375     UpdateCIfrMinMaxStepData(&mNumeric->data);
1376   }
1377 
1378   EFI_VFR_RETURN_CODE SetFlags (IN UINT8 HFlags, IN UINT8 LFlags, BOOLEAN DisplaySettingsSpecified = FALSE) {
1379     EFI_VFR_RETURN_CODE Ret;
1380 
1381     Ret = CIfrQuestionHeader::SetFlags (HFlags);
1382     if (Ret != VFR_RETURN_SUCCESS) {
1383       return Ret;
1384     }
1385 
1386     if (DisplaySettingsSpecified == FALSE) {
1387       mNumeric->Flags = LFlags | EFI_IFR_DISPLAY_UINT_DEC;
1388     } else {
1389       mNumeric->Flags = LFlags;
1390     }
1391     return VFR_RETURN_SUCCESS;
1392   }
1393 
1394   EFI_VFR_RETURN_CODE SetFlagsForBitField (IN UINT8 HFlags, IN UINT8 LFlags, BOOLEAN DisplaySettingsSpecified = FALSE) {
1395     EFI_VFR_RETURN_CODE Ret;
1396 
1397     Ret = CIfrQuestionHeader::SetFlags (HFlags);
1398     if (Ret != VFR_RETURN_SUCCESS) {
1399       return Ret;
1400     }
1401 
1402     if (DisplaySettingsSpecified == FALSE) {
1403       mNumeric->Flags = LFlags | EDKII_IFR_DISPLAY_UINT_DEC_BIT;
1404     } else {
1405       mNumeric->Flags = LFlags;
1406     }
1407     return VFR_RETURN_SUCCESS;
1408   }
1409 
GetNumericFlags()1410   UINT8 GetNumericFlags () {
1411     return mNumeric->Flags;
1412   }
1413 };
1414 
1415 class CIfrOneOf : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader, public CIfrMinMaxStepData {
1416 private:
1417   EFI_IFR_ONE_OF *mOneOf;
1418 
1419 public:
CIfrOneOf()1420   CIfrOneOf () : CIfrObj (EFI_IFR_ONE_OF_OP, (CHAR8 **)NULL, sizeof (EFI_IFR_ONE_OF), TRUE),
1421                  CIfrOpHeader (EFI_IFR_ONE_OF_OP, &(GetObjBinAddr<EFI_IFR_ONE_OF>())->Header),
1422                  CIfrQuestionHeader (&(GetObjBinAddr<EFI_IFR_ONE_OF>())->Question),
1423                  CIfrMinMaxStepData (&(GetObjBinAddr<EFI_IFR_ONE_OF>())->data), mOneOf(GetObjBinAddr<EFI_IFR_ONE_OF>()) {
1424     mOneOf->Flags    = 0;
1425     gCurrentQuestion   = this;
1426     gCurrentMinMaxData = this;
1427   }
1428 
~CIfrOneOf()1429   ~CIfrOneOf () {
1430     gCurrentQuestion   = NULL;
1431     gCurrentMinMaxData = NULL;
1432   }
1433 
SetFlags(IN UINT8 HFlags,IN UINT8 LFlags)1434   EFI_VFR_RETURN_CODE SetFlags (IN UINT8 HFlags, IN UINT8 LFlags) {
1435     EFI_VFR_RETURN_CODE Ret;
1436 
1437     Ret = CIfrQuestionHeader::SetFlags (HFlags);
1438     if (Ret != VFR_RETURN_SUCCESS) {
1439       return Ret;
1440     }
1441 
1442     if (LFlags & EFI_IFR_DISPLAY) {
1443       mOneOf->Flags = LFlags;
1444     } else {
1445       mOneOf->Flags = LFlags | EFI_IFR_DISPLAY_UINT_DEC;
1446     }
1447     return VFR_RETURN_SUCCESS;
1448   }
1449 
SetFlagsForBitField(IN UINT8 HFlags,IN UINT8 LFlags)1450   EFI_VFR_RETURN_CODE SetFlagsForBitField (IN UINT8 HFlags, IN UINT8 LFlags) {
1451     EFI_VFR_RETURN_CODE Ret;
1452 
1453     Ret = CIfrQuestionHeader::SetFlags (HFlags);
1454     if (Ret != VFR_RETURN_SUCCESS) {
1455       return Ret;
1456     }
1457 
1458     if (LFlags & EFI_IFR_DISPLAY) {
1459       mOneOf->Flags = LFlags;
1460     } else {
1461       mOneOf->Flags = LFlags | EDKII_IFR_DISPLAY_UINT_DEC_BIT;
1462     }
1463     return VFR_RETURN_SUCCESS;
1464   }
1465 
ShrinkBinSize(IN UINT16 Size)1466   VOID ShrinkBinSize (IN UINT16 Size) {
1467     //
1468     // Update the buffer size which is truly be used later.
1469     //
1470     ShrinkObjBin(Size);
1471     DecLength(Size);
1472 
1473     //
1474     // Allocate buffer in gCFormPkg.
1475     //
1476     _EMIT_PENDING_OBJ();
1477 
1478     //
1479     // Update the buffer pointer used by other class.
1480     //
1481     mOneOf = GetObjBinAddr<EFI_IFR_ONE_OF>();
1482     UpdateHeader (&mOneOf->Header);
1483     UpdateCIfrQuestionHeader(&mOneOf->Question);
1484     UpdateCIfrMinMaxStepData(&mOneOf->data);
1485   }
1486 };
1487 
1488 class CIfrString : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {
1489 private:
1490   EFI_IFR_STRING *mString;
1491 
1492 public:
CIfrString()1493   CIfrString () : CIfrObj (EFI_IFR_STRING_OP),
1494                  CIfrOpHeader (EFI_IFR_STRING_OP, &(GetObjBinAddr<EFI_IFR_STRING>())->Header),
1495                  CIfrQuestionHeader (&(GetObjBinAddr<EFI_IFR_STRING>())->Question), mString(GetObjBinAddr<EFI_IFR_STRING>()) {
1496     mString->Flags   = 0;
1497     mString->MinSize = 0;
1498     mString->MaxSize = 0;
1499     gCurrentQuestion = this;
1500   }
1501 
~CIfrString()1502   ~CIfrString () {
1503     gCurrentQuestion = NULL;
1504   }
1505 
SetFlags(IN UINT8 HFlags,IN UINT8 LFlags)1506   EFI_VFR_RETURN_CODE SetFlags (IN UINT8 HFlags, IN UINT8 LFlags) {
1507     EFI_VFR_RETURN_CODE Ret;
1508 
1509     Ret = CIfrQuestionHeader::SetFlags (HFlags);
1510     if (Ret != VFR_RETURN_SUCCESS) {
1511       return Ret;
1512     }
1513 
1514     if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_IFR_STRING_MULTI_LINE)) {
1515       mString->Flags |= EFI_IFR_STRING_MULTI_LINE;
1516     }
1517 
1518     return _FLAGS_ZERO (LFlags) ? VFR_RETURN_SUCCESS : VFR_RETURN_FLAGS_UNSUPPORTED;
1519   }
1520 
SetMinSize(IN UINT8 Flags)1521   VOID SetMinSize (IN UINT8 Flags) {
1522     mString->MinSize = Flags;
1523   }
1524 
SetMaxSize(IN UINT8 MaxSize)1525   VOID SetMaxSize (IN UINT8 MaxSize) {
1526     mString->MaxSize = MaxSize;
1527   }
1528 };
1529 
1530 class CIfrPassword : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {
1531 private:
1532   EFI_IFR_PASSWORD *mPassword;
1533 
1534 public:
CIfrPassword()1535   CIfrPassword () : CIfrObj (EFI_IFR_PASSWORD_OP),
1536                     CIfrOpHeader (EFI_IFR_PASSWORD_OP, &(GetObjBinAddr<EFI_IFR_PASSWORD>())->Header),
1537                     CIfrQuestionHeader (&(GetObjBinAddr<EFI_IFR_PASSWORD>())->Question), mPassword(GetObjBinAddr<EFI_IFR_PASSWORD>()) {
1538     mPassword->MinSize = 0;
1539     mPassword->MaxSize = 0;
1540     gCurrentQuestion   = this;
1541   }
1542 
~CIfrPassword()1543   ~CIfrPassword () {
1544     gCurrentQuestion = NULL;
1545   }
1546 
SetMinSize(IN UINT16 MinSize)1547   VOID SetMinSize (IN UINT16 MinSize) {
1548     mPassword->MinSize = MinSize;
1549   }
1550 
SetMaxSize(IN UINT16 MaxSize)1551   VOID SetMaxSize (IN UINT16 MaxSize) {
1552     mPassword->MaxSize = MaxSize;
1553   }
1554 };
1555 
1556 class CIfrOrderedList : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {
1557 private:
1558   EFI_IFR_ORDERED_LIST *mOrderedList;
1559 
1560 public:
CIfrOrderedList()1561   CIfrOrderedList () : CIfrObj (EFI_IFR_ORDERED_LIST_OP),
1562                       CIfrOpHeader (EFI_IFR_ORDERED_LIST_OP, &(GetObjBinAddr<EFI_IFR_ORDERED_LIST>())->Header),
1563                       CIfrQuestionHeader (&(GetObjBinAddr<EFI_IFR_ORDERED_LIST>())->Question), mOrderedList(GetObjBinAddr<EFI_IFR_ORDERED_LIST>()) {
1564     mOrderedList->MaxContainers = 0;
1565     mOrderedList->Flags         = 0;
1566     gCurrentQuestion            = this;
1567   }
1568 
~CIfrOrderedList()1569   ~CIfrOrderedList () {
1570     gCurrentQuestion = NULL;
1571   }
1572 
SetMaxContainers(IN UINT8 MaxContainers)1573   VOID SetMaxContainers (IN UINT8 MaxContainers) {
1574     mOrderedList->MaxContainers = MaxContainers;
1575   }
1576 
SetFlags(IN UINT8 HFlags,IN UINT8 LFlags)1577   EFI_VFR_RETURN_CODE SetFlags (IN UINT8 HFlags, IN UINT8 LFlags) {
1578     EFI_VFR_RETURN_CODE Ret;
1579 
1580     Ret = CIfrQuestionHeader::SetFlags (HFlags);
1581     if (Ret != VFR_RETURN_SUCCESS) {
1582       return Ret;
1583     }
1584 
1585     if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_IFR_UNIQUE_SET)) {
1586       mOrderedList->Flags |= EFI_IFR_UNIQUE_SET;
1587     }
1588 
1589     if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_IFR_NO_EMPTY_SET)) {
1590       mOrderedList->Flags |= EFI_IFR_NO_EMPTY_SET;
1591     }
1592 
1593     return _FLAGS_ZERO (LFlags) ? VFR_RETURN_SUCCESS : VFR_RETURN_FLAGS_UNSUPPORTED;
1594   }
1595 };
1596 
1597 class CIfrTime : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {
1598 private:
1599   EFI_IFR_TIME *mTime;
1600 
1601 public:
CIfrTime()1602   CIfrTime () : CIfrObj (EFI_IFR_TIME_OP),
1603                 CIfrOpHeader (EFI_IFR_TIME_OP, &(GetObjBinAddr<EFI_IFR_TIME>())->Header),
1604                 CIfrQuestionHeader (&(GetObjBinAddr<EFI_IFR_TIME>())->Question), mTime(GetObjBinAddr<EFI_IFR_TIME>()) {
1605     mTime->Flags = 0;
1606   }
1607 
SetFlags(IN UINT8 HFlags,IN UINT8 LFlags)1608   EFI_VFR_RETURN_CODE SetFlags (IN UINT8 HFlags, IN UINT8 LFlags) {
1609     EFI_VFR_RETURN_CODE Ret;
1610 
1611     Ret = CIfrQuestionHeader::SetFlags (HFlags);
1612     if (Ret != VFR_RETURN_SUCCESS) {
1613       return Ret;
1614     }
1615 
1616     if (_FLAG_TEST_AND_CLEAR (LFlags, QF_TIME_HOUR_SUPPRESS)) {
1617       mTime->Flags |= QF_TIME_HOUR_SUPPRESS;
1618     }
1619 
1620     if (_FLAG_TEST_AND_CLEAR (LFlags, QF_TIME_MINUTE_SUPPRESS)) {
1621       mTime->Flags |= QF_TIME_MINUTE_SUPPRESS;
1622     }
1623 
1624     if (_FLAG_TEST_AND_CLEAR (LFlags, QF_TIME_SECOND_SUPPRESS)) {
1625       mTime->Flags |= QF_TIME_SECOND_SUPPRESS;
1626     }
1627 
1628     if (_FLAG_TEST_AND_CLEAR (LFlags, QF_TIME_STORAGE_NORMAL)) {
1629       mTime->Flags |= QF_TIME_STORAGE_NORMAL;
1630     } else if (_FLAG_TEST_AND_CLEAR (LFlags, QF_TIME_STORAGE_TIME)) {
1631       mTime->Flags |= QF_TIME_STORAGE_TIME;
1632     } else if (_FLAG_TEST_AND_CLEAR (LFlags, QF_TIME_STORAGE_WAKEUP)) {
1633       mTime->Flags |= QF_TIME_STORAGE_WAKEUP;
1634     }
1635 
1636     return _FLAGS_ZERO (LFlags) ? VFR_RETURN_SUCCESS : VFR_RETURN_FLAGS_UNSUPPORTED;
1637   }
1638 };
1639 
1640 class CIfrDisableIf : public CIfrObj, public CIfrOpHeader {
1641 public:
CIfrDisableIf()1642   CIfrDisableIf () : CIfrObj (EFI_IFR_DISABLE_IF_OP),
1643                    CIfrOpHeader (EFI_IFR_DISABLE_IF_OP, &(GetObjBinAddr<EFI_IFR_DISABLE_IF>())->Header) {}
1644 };
1645 
1646 class CIfrSuppressIf : public CIfrObj, public CIfrOpHeader {
1647 public:
CIfrSuppressIf()1648   CIfrSuppressIf () : CIfrObj (EFI_IFR_SUPPRESS_IF_OP),
1649                      CIfrOpHeader (EFI_IFR_SUPPRESS_IF_OP, &(GetObjBinAddr<EFI_IFR_SUPPRESS_IF>())->Header) {}
1650 };
1651 
1652 class CIfrGrayOutIf : public CIfrObj, public CIfrOpHeader {
1653 public:
CIfrGrayOutIf()1654   CIfrGrayOutIf () : CIfrObj (EFI_IFR_GRAY_OUT_IF_OP),
1655                     CIfrOpHeader (EFI_IFR_GRAY_OUT_IF_OP, &(GetObjBinAddr<EFI_IFR_GRAY_OUT_IF>())->Header) {}
1656 };
1657 
1658 class CIfrInconsistentIf : public CIfrObj, public CIfrOpHeader {
1659 private:
1660   EFI_IFR_INCONSISTENT_IF *mInconsistentIf;
1661 
1662 public:
CIfrInconsistentIf()1663   CIfrInconsistentIf () : CIfrObj (EFI_IFR_INCONSISTENT_IF_OP),
1664                         CIfrOpHeader (EFI_IFR_INCONSISTENT_IF_OP, &(GetObjBinAddr<EFI_IFR_INCONSISTENT_IF>())->Header), mInconsistentIf(GetObjBinAddr<EFI_IFR_INCONSISTENT_IF>()) {
1665     mInconsistentIf->Error = EFI_STRING_ID_INVALID;
1666   }
1667 
SetError(IN EFI_STRING_ID Error)1668   VOID SetError (IN EFI_STRING_ID Error) {
1669     mInconsistentIf->Error = Error;
1670   }
1671 };
1672 
1673 class CIfrWarningIf : public CIfrObj, public CIfrOpHeader {
1674 private:
1675   EFI_IFR_WARNING_IF *mWarningIf;
1676 
1677 public:
CIfrWarningIf()1678   CIfrWarningIf () : CIfrObj (EFI_IFR_WARNING_IF_OP),
1679                         CIfrOpHeader (EFI_IFR_WARNING_IF_OP, &(GetObjBinAddr<EFI_IFR_WARNING_IF>())->Header), mWarningIf(GetObjBinAddr<EFI_IFR_WARNING_IF>()) {
1680     mWarningIf->Warning = EFI_STRING_ID_INVALID;
1681     mWarningIf->TimeOut = 0;
1682   }
1683 
SetWarning(IN EFI_STRING_ID Warning)1684   VOID SetWarning (IN EFI_STRING_ID Warning) {
1685     mWarningIf->Warning = Warning;
1686   }
1687 
SetTimeOut(IN UINT8 TimeOut)1688   VOID SetTimeOut (IN UINT8 TimeOut) {
1689     mWarningIf->TimeOut = TimeOut;
1690   }
1691 };
1692 
1693 class CIfrNoSubmitIf : public CIfrObj, public CIfrOpHeader {
1694 private:
1695   EFI_IFR_NO_SUBMIT_IF *mNoSubmitIf;
1696 
1697 public:
CIfrNoSubmitIf()1698   CIfrNoSubmitIf () : CIfrObj (EFI_IFR_NO_SUBMIT_IF_OP),
1699                      CIfrOpHeader (EFI_IFR_NO_SUBMIT_IF_OP, &(GetObjBinAddr<EFI_IFR_NO_SUBMIT_IF>())->Header), mNoSubmitIf(GetObjBinAddr<EFI_IFR_NO_SUBMIT_IF>()) {
1700     mNoSubmitIf->Error = EFI_STRING_ID_INVALID;
1701   }
1702 
SetError(IN EFI_STRING_ID Error)1703   VOID SetError (IN EFI_STRING_ID Error) {
1704     mNoSubmitIf->Error = Error;
1705   }
1706 };
1707 
1708 class CIfrRefresh : public CIfrObj, public CIfrOpHeader {
1709 private:
1710   EFI_IFR_REFRESH *mRefresh;
1711 
1712 public:
CIfrRefresh()1713   CIfrRefresh () : CIfrObj (EFI_IFR_REFRESH_OP),
1714                   CIfrOpHeader (EFI_IFR_REFRESH_OP, &(GetObjBinAddr<EFI_IFR_REFRESH>())->Header), mRefresh(GetObjBinAddr<EFI_IFR_REFRESH>()) {
1715     mRefresh->RefreshInterval = 0;
1716   }
1717 
SetRefreshInterval(IN UINT8 RefreshInterval)1718   VOID SetRefreshInterval (IN UINT8 RefreshInterval) {
1719     mRefresh->RefreshInterval = RefreshInterval;
1720   }
1721 };
1722 
1723 class CIfrRefreshId : public CIfrObj, public CIfrOpHeader {
1724 private:
1725   EFI_IFR_REFRESH_ID *mRefreshId;
1726 
1727 public:
CIfrRefreshId()1728   CIfrRefreshId () : CIfrObj (EFI_IFR_REFRESH_ID_OP),
1729       CIfrOpHeader (EFI_IFR_REFRESH_ID_OP, &(GetObjBinAddr<EFI_IFR_REFRESH_ID>())->Header), mRefreshId(GetObjBinAddr<EFI_IFR_REFRESH_ID>()) {
1730     memset (&mRefreshId->RefreshEventGroupId, 0, sizeof (EFI_GUID));
1731   }
1732 
SetRefreshEventGroutId(IN EFI_GUID * RefreshEventGroupId)1733   VOID SetRefreshEventGroutId (IN EFI_GUID *RefreshEventGroupId) {
1734     memmove (&mRefreshId->RefreshEventGroupId, RefreshEventGroupId, sizeof (EFI_GUID));
1735   }
1736 };
1737 
1738 class CIfrVarStoreDevice : public CIfrObj, public CIfrOpHeader {
1739 private:
1740   EFI_IFR_VARSTORE_DEVICE *mVarStoreDevice;
1741 
1742 public:
CIfrVarStoreDevice()1743   CIfrVarStoreDevice () : CIfrObj (EFI_IFR_VARSTORE_DEVICE_OP),
1744                           CIfrOpHeader (EFI_IFR_VARSTORE_DEVICE_OP, &(GetObjBinAddr<EFI_IFR_VARSTORE_DEVICE>())->Header), mVarStoreDevice(GetObjBinAddr<EFI_IFR_VARSTORE_DEVICE>()) {
1745     mVarStoreDevice->DevicePath = EFI_STRING_ID_INVALID;
1746   }
1747 
SetDevicePath(IN EFI_STRING_ID DevicePath)1748   VOID SetDevicePath (IN EFI_STRING_ID DevicePath) {
1749     mVarStoreDevice->DevicePath = DevicePath;
1750   }
1751 };
1752 
1753 class CIfrOneOfOption : public CIfrObj, public CIfrOpHeader {
1754 private:
1755   EFI_IFR_ONE_OF_OPTION *mOneOfOption;
1756 
1757 public:
CIfrOneOfOption(UINT8 Size)1758   CIfrOneOfOption (UINT8 Size) : CIfrObj (EFI_IFR_ONE_OF_OPTION_OP, (CHAR8 **)NULL, Size),
1759                        CIfrOpHeader (EFI_IFR_ONE_OF_OPTION_OP, &(GetObjBinAddr<EFI_IFR_ONE_OF_OPTION>())->Header, Size), mOneOfOption(GetObjBinAddr<EFI_IFR_ONE_OF_OPTION>()) {
1760     mOneOfOption->Flags  = 0;
1761     mOneOfOption->Option = EFI_STRING_ID_INVALID;
1762     mOneOfOption->Type   = EFI_IFR_TYPE_OTHER;
1763     memset (&mOneOfOption->Value, 0, Size - OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value));
1764   }
1765 
SetOption(IN EFI_STRING_ID Option)1766   VOID SetOption (IN EFI_STRING_ID Option) {
1767     mOneOfOption->Option = Option;
1768   }
1769 
SetFlags(IN UINT8 LFlags)1770   EFI_VFR_RETURN_CODE SetFlags (IN UINT8 LFlags) {
1771     mOneOfOption->Flags = 0;
1772     if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_IFR_OPTION_DEFAULT)) {
1773       mOneOfOption->Flags |= EFI_IFR_OPTION_DEFAULT;
1774     }
1775 
1776     if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_IFR_OPTION_DEFAULT_MFG)) {
1777       mOneOfOption->Flags |= EFI_IFR_OPTION_DEFAULT_MFG;
1778     }
1779 
1780     if (_IS_EQUAL (LFlags, EFI_IFR_TYPE_NUM_SIZE_8)) {
1781       _FLAG_CLEAR (LFlags, EFI_IFR_TYPE_NUM_SIZE_8);
1782       mOneOfOption->Flags |= EFI_IFR_TYPE_NUM_SIZE_8;
1783     } else if (_IS_EQUAL (LFlags, EFI_IFR_TYPE_NUM_SIZE_16)) {
1784       _FLAG_CLEAR (LFlags, EFI_IFR_TYPE_NUM_SIZE_16);
1785       mOneOfOption->Flags |= EFI_IFR_TYPE_NUM_SIZE_16;
1786     } else if (_IS_EQUAL (LFlags, EFI_IFR_TYPE_NUM_SIZE_32)) {
1787       _FLAG_CLEAR (LFlags, EFI_IFR_TYPE_NUM_SIZE_32);
1788       mOneOfOption->Flags |= EFI_IFR_TYPE_NUM_SIZE_32;
1789     } else if (_IS_EQUAL (LFlags, EFI_IFR_TYPE_NUM_SIZE_64)) {
1790       _FLAG_CLEAR (LFlags, EFI_IFR_TYPE_NUM_SIZE_64);
1791       mOneOfOption->Flags |= EFI_IFR_TYPE_NUM_SIZE_64;
1792     } else if (_IS_EQUAL (LFlags, EFI_IFR_TYPE_BOOLEAN)) {
1793       _FLAG_CLEAR (LFlags, EFI_IFR_TYPE_BOOLEAN);
1794       mOneOfOption->Flags |= EFI_IFR_TYPE_BOOLEAN;
1795     } else if (_IS_EQUAL (LFlags, EFI_IFR_TYPE_TIME)) {
1796       _FLAG_CLEAR (LFlags, EFI_IFR_TYPE_TIME);
1797       mOneOfOption->Flags |= EFI_IFR_TYPE_TIME;
1798     } else if (_IS_EQUAL (LFlags, EFI_IFR_TYPE_DATE)) {
1799       _FLAG_CLEAR (LFlags, EFI_IFR_TYPE_DATE);
1800       mOneOfOption->Flags |= EFI_IFR_TYPE_DATE;
1801     } else if (_IS_EQUAL (LFlags, EFI_IFR_TYPE_STRING)) {
1802       _FLAG_CLEAR (LFlags, EFI_IFR_TYPE_STRING);
1803       mOneOfOption->Flags |= EFI_IFR_TYPE_STRING;
1804     } else if (_IS_EQUAL (LFlags, EFI_IFR_TYPE_OTHER)) {
1805       _FLAG_CLEAR (LFlags, EFI_IFR_TYPE_OTHER);
1806       mOneOfOption->Flags |= EFI_IFR_TYPE_OTHER;
1807     }
1808 
1809     return _FLAGS_ZERO (LFlags) ? VFR_RETURN_SUCCESS : VFR_RETURN_FLAGS_UNSUPPORTED;
1810   }
1811 
SetType(IN UINT8 Type)1812   VOID SetType (IN UINT8 Type) {
1813     mOneOfOption->Type = Type;
1814   }
1815 
SetValue(IN EFI_IFR_TYPE_VALUE Value)1816   VOID SetValue (IN EFI_IFR_TYPE_VALUE Value) {
1817     memmove (&mOneOfOption->Value, &Value, mOneOfOption->Header.Length - OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value));
1818   }
1819 
GetFlags(VOID)1820   UINT8 GetFlags (VOID) {
1821     return mOneOfOption->Flags;
1822   }
1823 };
1824 
1825 static EFI_GUID IfrTianoGuid     = EFI_IFR_TIANO_GUID;
1826 static EFI_GUID IfrFrameworkGuid = EFI_IFR_FRAMEWORK_GUID;
1827 
1828 class CIfrClass : public CIfrObj, public CIfrOpHeader {
1829 private:
1830   EFI_IFR_GUID_CLASS *mClass;
1831 
1832 public:
CIfrClass()1833   CIfrClass () : CIfrObj (EFI_IFR_GUID_OP, (CHAR8 **)NULL, sizeof (EFI_IFR_GUID_CLASS)),
1834                 CIfrOpHeader (EFI_IFR_GUID_OP, &(GetObjBinAddr<EFI_IFR_GUID_CLASS>())->Header, sizeof (EFI_IFR_GUID_CLASS)), mClass(GetObjBinAddr<EFI_IFR_GUID_CLASS>()) {
1835     mClass->ExtendOpCode = EFI_IFR_EXTEND_OP_CLASS;
1836     mClass->Guid         = IfrTianoGuid;
1837     mClass->Class        = EFI_NON_DEVICE_CLASS;
1838   }
1839 
SetClass(IN UINT16 Class)1840   VOID SetClass (IN UINT16 Class) {
1841     mClass->Class        = Class;
1842   }
1843 };
1844 
1845 class CIfrSubClass : public CIfrObj, public CIfrOpHeader {
1846 private:
1847   EFI_IFR_GUID_SUBCLASS *mSubClass;
1848 
1849 public:
CIfrSubClass()1850   CIfrSubClass () : CIfrObj (EFI_IFR_GUID_OP, (CHAR8 **)NULL, sizeof (EFI_IFR_GUID_SUBCLASS)),
1851                     CIfrOpHeader (EFI_IFR_GUID_OP, &(GetObjBinAddr<EFI_IFR_GUID_SUBCLASS>())->Header, sizeof (EFI_IFR_GUID_SUBCLASS)), mSubClass(GetObjBinAddr<EFI_IFR_GUID_SUBCLASS>()) {
1852     mSubClass->ExtendOpCode = EFI_IFR_EXTEND_OP_SUBCLASS;
1853     mSubClass->Guid         = IfrTianoGuid;
1854     mSubClass->SubClass     = EFI_SETUP_APPLICATION_SUBCLASS;
1855   }
1856 
SetSubClass(IN UINT16 SubClass)1857   VOID SetSubClass (IN UINT16 SubClass) {
1858     mSubClass->SubClass = SubClass;
1859   }
1860 };
1861 
1862 class CIfrLabel : public CIfrObj, public CIfrOpHeader {
1863 private:
1864   EFI_IFR_GUID_LABEL *mLabel;
1865 
1866 public:
CIfrLabel()1867   CIfrLabel () : CIfrObj (EFI_IFR_GUID_OP, (CHAR8 **)NULL, sizeof (EFI_IFR_GUID_LABEL)),
1868                 CIfrOpHeader (EFI_IFR_GUID_OP, &(GetObjBinAddr<EFI_IFR_GUID_LABEL>())->Header, sizeof (EFI_IFR_GUID_LABEL)), mLabel(GetObjBinAddr<EFI_IFR_GUID_LABEL>()) {
1869     mLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
1870     mLabel->Guid         = IfrTianoGuid;
1871   }
1872 
SetNumber(IN UINT16 Number)1873   VOID SetNumber (IN UINT16 Number) {
1874     mLabel->Number = Number;
1875   }
1876 };
1877 
1878 class CIfrBanner : public CIfrObj, public CIfrOpHeader {
1879 private:
1880   EFI_IFR_GUID_BANNER *mBanner;
1881 
1882 public:
CIfrBanner()1883   CIfrBanner () : CIfrObj (EFI_IFR_GUID_OP, (CHAR8 **)NULL, sizeof (EFI_IFR_GUID_BANNER)),
1884                   CIfrOpHeader (EFI_IFR_GUID_OP, &(GetObjBinAddr<EFI_IFR_GUID_BANNER>())->Header, sizeof (EFI_IFR_GUID_BANNER)), mBanner(GetObjBinAddr<EFI_IFR_GUID_BANNER>()) {
1885     mBanner->ExtendOpCode = EFI_IFR_EXTEND_OP_BANNER;
1886     mBanner->Guid         = IfrTianoGuid;
1887   }
1888 
SetTitle(IN EFI_STRING_ID StringId)1889   VOID SetTitle (IN EFI_STRING_ID StringId) {
1890     mBanner->Title = StringId;
1891   }
1892 
SetLine(IN UINT16 Line)1893   VOID SetLine (IN UINT16 Line) {
1894     mBanner->LineNumber = Line;
1895   }
1896 
SetAlign(IN UINT8 Align)1897   VOID SetAlign (IN UINT8 Align) {
1898     mBanner->Alignment = Align;
1899   }
1900 };
1901 
1902 class CIfrOptionKey : public CIfrObj, public CIfrOpHeader {
1903 private:
1904   EFI_IFR_GUID_OPTIONKEY *mOptionKey;
1905 
1906 public:
CIfrOptionKey(IN EFI_QUESTION_ID QuestionId,IN EFI_IFR_TYPE_VALUE & OptionValue,IN EFI_QUESTION_ID KeyValue)1907   CIfrOptionKey (
1908     IN EFI_QUESTION_ID QuestionId,
1909     IN EFI_IFR_TYPE_VALUE &OptionValue,
1910     IN EFI_QUESTION_ID KeyValue
1911   ) : CIfrObj (EFI_IFR_GUID_OP, (CHAR8 **)NULL, sizeof (EFI_IFR_GUID_OPTIONKEY)),
1912       CIfrOpHeader (EFI_IFR_GUID_OP, &(GetObjBinAddr<EFI_IFR_GUID_OPTIONKEY>())->Header, sizeof (EFI_IFR_GUID_OPTIONKEY)), mOptionKey(GetObjBinAddr<EFI_IFR_GUID_OPTIONKEY>()) {
1913     mOptionKey->ExtendOpCode = EFI_IFR_EXTEND_OP_OPTIONKEY;
1914     mOptionKey->Guid         = IfrFrameworkGuid;
1915     mOptionKey->QuestionId   = QuestionId;
1916     mOptionKey->OptionValue  = OptionValue;
1917     mOptionKey->KeyValue     = KeyValue;
1918   }
1919 };
1920 
1921 class CIfrVarEqName : public CIfrObj, public CIfrOpHeader {
1922 private:
1923   EFI_IFR_GUID_VAREQNAME *mVarEqName;
1924 
1925 public:
CIfrVarEqName(IN EFI_QUESTION_ID QuestionId,IN EFI_STRING_ID NameId)1926   CIfrVarEqName (
1927     IN EFI_QUESTION_ID QuestionId,
1928     IN EFI_STRING_ID   NameId
1929   ) : CIfrObj (EFI_IFR_GUID_OP, (CHAR8 **)NULL, sizeof (EFI_IFR_GUID_VAREQNAME)),
1930       CIfrOpHeader (EFI_IFR_GUID_OP, &(GetObjBinAddr<EFI_IFR_GUID_VAREQNAME>())->Header, sizeof (EFI_IFR_GUID_VAREQNAME)), mVarEqName(GetObjBinAddr<EFI_IFR_GUID_VAREQNAME>()) {
1931     mVarEqName->ExtendOpCode = EFI_IFR_EXTEND_OP_VAREQNAME;
1932     mVarEqName->Guid         = IfrFrameworkGuid;
1933     mVarEqName->QuestionId   = QuestionId;
1934     mVarEqName->NameId       = NameId;
1935   }
1936 };
1937 
1938 class CIfrTimeout : public CIfrObj, public CIfrOpHeader {
1939 private:
1940   EFI_IFR_GUID_TIMEOUT *mTimeout;
1941 
1942 public:
1943   CIfrTimeout (IN UINT16 Timeout = 0) : CIfrObj (EFI_IFR_GUID_OP, (CHAR8 **)NULL, sizeof (EFI_IFR_GUID_TIMEOUT)),
1944                                         CIfrOpHeader (EFI_IFR_GUID_OP, &(GetObjBinAddr<EFI_IFR_GUID_TIMEOUT>())->Header, sizeof (EFI_IFR_GUID_TIMEOUT)), mTimeout(GetObjBinAddr<EFI_IFR_GUID_TIMEOUT>()) {
1945     mTimeout->ExtendOpCode = EFI_IFR_EXTEND_OP_TIMEOUT;
1946     mTimeout->Guid         = IfrTianoGuid;
1947     mTimeout->TimeOut      = Timeout;
1948   }
1949 
SetTimeout(IN UINT16 Timeout)1950   VOID SetTimeout (IN UINT16 Timeout) {
1951     mTimeout->TimeOut = Timeout;
1952   }
1953 };
1954 
1955 class CIfrGuid : public CIfrObj, public CIfrOpHeader {
1956 private:
1957   EFI_IFR_GUID *mGuid;
1958 
1959 public:
CIfrGuid(UINT8 Size)1960   CIfrGuid (UINT8 Size) : CIfrObj (EFI_IFR_GUID_OP, (CHAR8 **)NULL, sizeof (EFI_IFR_GUID)+Size),
1961                   CIfrOpHeader (EFI_IFR_GUID_OP, &(GetObjBinAddr<EFI_IFR_GUID>())->Header, sizeof (EFI_IFR_GUID)+Size), mGuid(GetObjBinAddr<EFI_IFR_GUID>()) {
1962     memset (&mGuid->Guid, 0, sizeof (EFI_GUID));
1963   }
1964 
SetGuid(IN EFI_GUID * Guid)1965   VOID SetGuid (IN EFI_GUID *Guid) {
1966     memmove (&mGuid->Guid, Guid, sizeof (EFI_GUID));
1967   }
1968 
SetData(IN UINT8 * DataBuff,IN UINT8 Size)1969   VOID SetData (IN UINT8* DataBuff, IN UINT8 Size) {
1970     memmove ((UINT8 *)mGuid + sizeof (EFI_IFR_GUID), DataBuff, Size);
1971   }
1972 };
1973 
1974 class CIfrDup : public CIfrObj, public CIfrOpHeader {
1975 public:
CIfrDup(IN UINT32 LineNo)1976   CIfrDup (
1977   IN UINT32 LineNo
1978   ) : CIfrObj (EFI_IFR_DUP_OP),
1979       CIfrOpHeader (EFI_IFR_DUP_OP, &(GetObjBinAddr<EFI_IFR_DUP>())->Header) {
1980     SetLineNo (LineNo);
1981   }
1982 };
1983 
1984 class CIfrEqIdId : public CIfrObj, public CIfrOpHeader {
1985 private:
1986   EFI_IFR_EQ_ID_ID   *mEqIdId;
1987 
1988 public:
CIfrEqIdId(IN UINT32 LineNo)1989   CIfrEqIdId (
1990   IN UINT32 LineNo
1991   ) : CIfrObj (EFI_IFR_EQ_ID_ID_OP),
1992                  CIfrOpHeader (EFI_IFR_EQ_ID_ID_OP, &(GetObjBinAddr<EFI_IFR_EQ_ID_ID>())->Header), mEqIdId(GetObjBinAddr<EFI_IFR_EQ_ID_ID>()) {
1993     SetLineNo (LineNo);
1994     mEqIdId->QuestionId1 = EFI_QUESTION_ID_INVALID;
1995     mEqIdId->QuestionId2 = EFI_QUESTION_ID_INVALID;
1996   }
1997 
SetQuestionId1(IN EFI_QUESTION_ID QuestionId,IN CHAR8 * VarIdStr,IN UINT32 LineNo)1998   VOID SetQuestionId1 (
1999   IN EFI_QUESTION_ID QuestionId,
2000   IN CHAR8            *VarIdStr,
2001   IN UINT32          LineNo
2002   ) {
2003     if (QuestionId != EFI_QUESTION_ID_INVALID) {
2004       mEqIdId->QuestionId1 = QuestionId;
2005     } else {
2006       gCFormPkg.AssignPending (VarIdStr, (VOID *)(&mEqIdId->QuestionId1), sizeof (EFI_QUESTION_ID), LineNo, NO_QST_REFED);
2007     }
2008   }
2009 
SetQuestionId2(IN EFI_QUESTION_ID QuestionId,IN CHAR8 * VarIdStr,IN UINT32 LineNo)2010   VOID SetQuestionId2 (
2011   IN EFI_QUESTION_ID QuestionId,
2012   IN CHAR8            *VarIdStr,
2013   IN UINT32          LineNo
2014   ) {
2015     if (QuestionId != EFI_QUESTION_ID_INVALID) {
2016       mEqIdId->QuestionId2 = QuestionId;
2017     } else {
2018       gCFormPkg.AssignPending (VarIdStr, (VOID *)(&mEqIdId->QuestionId2), sizeof (EFI_QUESTION_ID), LineNo, NO_QST_REFED);
2019     }
2020   }
2021 };
2022 
2023 class CIfrEqIdVal : public CIfrObj, public CIfrOpHeader {
2024 private:
2025   EFI_IFR_EQ_ID_VAL *mEqIdVal;
2026 
2027 public:
CIfrEqIdVal(IN UINT32 LineNo)2028   CIfrEqIdVal (
2029   IN UINT32 LineNo
2030   ) : CIfrObj (EFI_IFR_EQ_ID_VAL_OP),
2031       CIfrOpHeader (EFI_IFR_EQ_ID_VAL_OP, &(GetObjBinAddr<EFI_IFR_EQ_ID_VAL>())->Header), mEqIdVal(GetObjBinAddr<EFI_IFR_EQ_ID_VAL>()) {
2032     SetLineNo (LineNo);
2033     mEqIdVal->QuestionId = EFI_QUESTION_ID_INVALID;
2034   }
2035 
SetQuestionId(IN EFI_QUESTION_ID QuestionId,IN CHAR8 * VarIdStr,IN UINT32 LineNo)2036   VOID SetQuestionId (
2037   IN EFI_QUESTION_ID QuestionId,
2038   IN CHAR8           *VarIdStr,
2039   IN UINT32          LineNo
2040   ) {
2041     if (QuestionId != EFI_QUESTION_ID_INVALID) {
2042       mEqIdVal->QuestionId = QuestionId;
2043     } else {
2044       gCFormPkg.AssignPending (VarIdStr, (VOID *)(&mEqIdVal->QuestionId), sizeof (EFI_QUESTION_ID), LineNo, NO_QST_REFED);
2045     }
2046   }
2047 
SetValue(IN UINT16 Value)2048   VOID SetValue (IN UINT16 Value) {
2049     mEqIdVal->Value = Value;
2050   }
2051 };
2052 
2053 class CIfrEqIdList : public CIfrObj, public CIfrOpHeader {
2054 private:
2055   EFI_IFR_EQ_ID_VAL_LIST *mEqIdVList;
2056 
2057 public:
CIfrEqIdList(IN UINT32 LineNo)2058   CIfrEqIdList (
2059   IN UINT32 LineNo
2060   ) : CIfrObj (EFI_IFR_EQ_ID_VAL_LIST_OP, (CHAR8 **)NULL, sizeof (EFI_IFR_EQ_ID_VAL_LIST), TRUE),
2061                    CIfrOpHeader (EFI_IFR_EQ_ID_VAL_LIST_OP, &(GetObjBinAddr<EFI_IFR_EQ_ID_VAL_LIST>())->Header), mEqIdVList(GetObjBinAddr<EFI_IFR_EQ_ID_VAL_LIST>()) {
2062     SetLineNo (LineNo);
2063     mEqIdVList->QuestionId   = EFI_QUESTION_ID_INVALID;
2064     mEqIdVList->ListLength   = 0;
2065     mEqIdVList->ValueList[0] = 0;
2066   }
2067 
UpdateIfrBuffer()2068   VOID UpdateIfrBuffer (
2069   ) {
2070     _EMIT_PENDING_OBJ();
2071     mEqIdVList = GetObjBinAddr<EFI_IFR_EQ_ID_VAL_LIST>();
2072     UpdateHeader (&mEqIdVList->Header);
2073   }
2074 
SetQuestionId(IN EFI_QUESTION_ID QuestionId,IN CHAR8 * VarIdStr,IN UINT32 LineNo)2075   VOID SetQuestionId (
2076   IN EFI_QUESTION_ID QuestionId,
2077   IN CHAR8           *VarIdStr,
2078   IN UINT32          LineNo
2079   ) {
2080     if (QuestionId != EFI_QUESTION_ID_INVALID) {
2081       mEqIdVList->QuestionId = QuestionId;
2082     } else {
2083       gCFormPkg.AssignPending (VarIdStr, (VOID *)(&mEqIdVList->QuestionId), sizeof (EFI_QUESTION_ID), LineNo, NO_QST_REFED);
2084     }
2085   }
2086 
SetListLength(IN UINT16 ListLength)2087   VOID SetListLength (IN UINT16 ListLength) {
2088     mEqIdVList->ListLength = ListLength;
2089   }
2090 
SetValueList(IN UINT16 Index,IN UINT16 Value)2091   VOID SetValueList (IN UINT16 Index, IN UINT16 Value) {
2092     if (Index == 0) {
2093       mEqIdVList->ValueList[0] = Value;
2094       return;
2095     }
2096 
2097     if (ExpendObjBin (sizeof (UINT16)) ==TRUE) {
2098       IncLength (sizeof (UINT16));
2099       mEqIdVList->ValueList[Index] = Value;
2100     }
2101   }
2102 };
2103 
2104 class CIfrQuestionRef1 : public CIfrObj, public CIfrOpHeader {
2105 private:
2106   EFI_IFR_QUESTION_REF1 *mQuestionRef1;
2107 
2108 public:
CIfrQuestionRef1(IN UINT32 LineNo)2109   CIfrQuestionRef1 (
2110   IN UINT32 LineNo
2111   ) : CIfrObj (EFI_IFR_QUESTION_REF1_OP),
2112       CIfrOpHeader (EFI_IFR_QUESTION_REF1_OP, &(GetObjBinAddr<EFI_IFR_QUESTION_REF1>())->Header), mQuestionRef1(GetObjBinAddr<EFI_IFR_QUESTION_REF1>()) {
2113     SetLineNo (LineNo);
2114     mQuestionRef1->QuestionId = EFI_QUESTION_ID_INVALID;
2115   }
2116 
SetQuestionId(IN EFI_QUESTION_ID QuestionId,IN CHAR8 * VarIdStr,IN UINT32 LineNo)2117   VOID SetQuestionId (
2118   IN EFI_QUESTION_ID QuestionId,
2119   IN CHAR8           *VarIdStr,
2120   IN UINT32          LineNo
2121   ) {
2122     if (QuestionId != EFI_QUESTION_ID_INVALID) {
2123       mQuestionRef1->QuestionId = QuestionId;
2124     } else {
2125       gCFormPkg.AssignPending (VarIdStr, (VOID *)(&mQuestionRef1->QuestionId), sizeof (EFI_QUESTION_ID), LineNo, NO_QST_REFED);
2126     }
2127   }
2128 };
2129 
2130 class CIfrQuestionRef2 : public CIfrObj, public CIfrOpHeader {
2131 public:
CIfrQuestionRef2(IN UINT32 LineNo)2132   CIfrQuestionRef2 (
2133   IN UINT32 LineNo
2134   ) : CIfrObj (EFI_IFR_QUESTION_REF2_OP),
2135       CIfrOpHeader (EFI_IFR_QUESTION_REF2_OP, &(GetObjBinAddr<EFI_IFR_QUESTION_REF2>())->Header) {
2136     SetLineNo (LineNo);
2137   }
2138 };
2139 
2140 class CIfrQuestionRef3 : public CIfrObj, public CIfrOpHeader {
2141 public:
CIfrQuestionRef3(IN UINT32 LineNo)2142   CIfrQuestionRef3 (
2143   IN UINT32 LineNo
2144   ) : CIfrObj (EFI_IFR_QUESTION_REF3_OP),
2145       CIfrOpHeader (EFI_IFR_QUESTION_REF3_OP, &(GetObjBinAddr<EFI_IFR_QUESTION_REF3>())->Header) {
2146     SetLineNo (LineNo);
2147   }
2148 };
2149 
2150 class CIfrQuestionRef3_2 : public CIfrObj, public CIfrOpHeader {
2151 private:
2152   EFI_IFR_QUESTION_REF3_2 *mQuestionRef3_2;
2153 
2154 public:
CIfrQuestionRef3_2(IN UINT32 LineNo)2155   CIfrQuestionRef3_2 (
2156   IN UINT32 LineNo
2157   ) : CIfrObj (EFI_IFR_QUESTION_REF3_OP, (CHAR8 **)NULL, sizeof (EFI_IFR_QUESTION_REF3_2)),
2158       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>()) {
2159     SetLineNo (LineNo);
2160     mQuestionRef3_2->DevicePath = EFI_STRING_ID_INVALID;
2161   }
2162 
SetDevicePath(IN EFI_STRING_ID DevicePath)2163   VOID SetDevicePath (IN EFI_STRING_ID DevicePath) {
2164     mQuestionRef3_2->DevicePath = DevicePath;
2165   }
2166 };
2167 
2168 class CIfrQuestionRef3_3 : public CIfrObj, public CIfrOpHeader {
2169 private:
2170   EFI_IFR_QUESTION_REF3_3 *mQuestionRef3_3;
2171 
2172 public:
CIfrQuestionRef3_3(IN UINT32 LineNo)2173   CIfrQuestionRef3_3 (
2174   IN UINT32 LineNo
2175   ) : CIfrObj (EFI_IFR_QUESTION_REF3_OP, (CHAR8 **)NULL, sizeof (EFI_IFR_QUESTION_REF3_3)),
2176       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>()) {
2177     SetLineNo (LineNo);
2178     mQuestionRef3_3->DevicePath = EFI_STRING_ID_INVALID;
2179     memset (&mQuestionRef3_3->Guid, 0, sizeof (EFI_GUID));
2180   }
2181 
SetDevicePath(IN EFI_STRING_ID DevicePath)2182   VOID SetDevicePath (IN EFI_STRING_ID DevicePath) {
2183     mQuestionRef3_3->DevicePath = DevicePath;
2184   }
2185 
SetGuid(IN EFI_GUID * Guid)2186   VOID SetGuid (IN EFI_GUID *Guid) {
2187     mQuestionRef3_3->Guid = *Guid;
2188   }
2189 };
2190 
2191 class CIfrRuleRef : public CIfrObj, public CIfrOpHeader {
2192 private:
2193   EFI_IFR_RULE_REF *mRuleRef;
2194 
2195 public:
CIfrRuleRef(IN UINT32 LineNo)2196   CIfrRuleRef (
2197   IN UINT32 LineNo
2198   ) : CIfrObj (EFI_IFR_RULE_REF_OP),
2199       CIfrOpHeader (EFI_IFR_RULE_REF_OP, &(GetObjBinAddr<EFI_IFR_RULE_REF>())->Header), mRuleRef(GetObjBinAddr<EFI_IFR_RULE_REF>()) {
2200     SetLineNo (LineNo);
2201     mRuleRef->RuleId = EFI_RULE_ID_INVALID;
2202   }
2203 
SetRuleId(IN UINT8 RuleId)2204   VOID SetRuleId (IN UINT8 RuleId) {
2205     mRuleRef->RuleId = RuleId;
2206   }
2207 };
2208 
2209 class CIfrStringRef1 : public CIfrObj, public CIfrOpHeader {
2210 private:
2211   EFI_IFR_STRING_REF1 *mStringRef1;
2212 
2213 public:
CIfrStringRef1(IN UINT32 LineNo)2214   CIfrStringRef1 (
2215   IN UINT32 LineNo
2216   ) : CIfrObj (EFI_IFR_STRING_REF1_OP),
2217       CIfrOpHeader (EFI_IFR_STRING_REF1_OP, &(GetObjBinAddr<EFI_IFR_STRING_REF1>())->Header), mStringRef1(GetObjBinAddr<EFI_IFR_STRING_REF1>()) {
2218     SetLineNo (LineNo);
2219     mStringRef1->StringId = EFI_STRING_ID_INVALID;
2220   }
2221 
SetStringId(IN EFI_STRING_ID StringId)2222   VOID SetStringId (IN EFI_STRING_ID StringId) {
2223     mStringRef1->StringId = StringId;
2224   }
2225 };
2226 
2227 class CIfrStringRef2 : public CIfrObj, public CIfrOpHeader {
2228 public:
CIfrStringRef2(IN UINT32 LineNo)2229   CIfrStringRef2 (
2230   IN UINT32 LineNo
2231   ) : CIfrObj (EFI_IFR_STRING_REF2_OP),
2232       CIfrOpHeader (EFI_IFR_STRING_REF2_OP, &(GetObjBinAddr<EFI_IFR_STRING_REF2>())->Header) {
2233     SetLineNo (LineNo);
2234   }
2235 };
2236 
2237 class CIfrThis : public CIfrObj, public CIfrOpHeader {
2238 public:
CIfrThis(IN UINT32 LineNo)2239   CIfrThis (
2240   IN UINT32 LineNo
2241   ) : CIfrObj (EFI_IFR_THIS_OP),
2242       CIfrOpHeader (EFI_IFR_THIS_OP, &(GetObjBinAddr<EFI_IFR_THIS>())->Header) {
2243     SetLineNo (LineNo);
2244   }
2245 };
2246 
2247 class CIfrSecurity : public CIfrObj, public CIfrOpHeader {
2248 private:
2249   EFI_IFR_SECURITY *mSecurity;
2250 
2251 public:
CIfrSecurity(IN UINT32 LineNo)2252   CIfrSecurity (
2253   IN UINT32 LineNo
2254   ) : CIfrObj (EFI_IFR_SECURITY_OP),
2255       CIfrOpHeader (EFI_IFR_SECURITY_OP, &(GetObjBinAddr<EFI_IFR_SECURITY>())->Header), mSecurity(GetObjBinAddr<EFI_IFR_SECURITY>()) {
2256     SetLineNo (LineNo);
2257     memset (&mSecurity->Permissions, 0, sizeof (EFI_GUID));
2258   }
2259 
SetPermissions(IN EFI_GUID * Permissions)2260   VOID SetPermissions (IN EFI_GUID *Permissions) {
2261     memmove (&mSecurity->Permissions, Permissions, sizeof (EFI_GUID));
2262   }
2263 };
2264 
2265 class CIfrUint8 : public CIfrObj, public CIfrOpHeader {
2266 private:
2267   EFI_IFR_UINT8 *mUint8;
2268 
2269 public:
CIfrUint8(IN UINT32 LineNo)2270   CIfrUint8 (
2271   IN UINT32 LineNo
2272   ) : CIfrObj (EFI_IFR_UINT8_OP),
2273       CIfrOpHeader (EFI_IFR_UINT8_OP, &(GetObjBinAddr<EFI_IFR_UINT8>())->Header), mUint8(GetObjBinAddr<EFI_IFR_UINT8>()) {
2274     SetLineNo (LineNo);
2275   }
2276 
SetValue(IN UINT8 Value)2277   VOID SetValue (IN UINT8 Value) {
2278     mUint8->Value = Value;
2279   }
2280 };
2281 
2282 class CIfrUint16 : public CIfrObj, public CIfrOpHeader {
2283 private:
2284   EFI_IFR_UINT16 *mUint16;
2285 
2286 public:
CIfrUint16(IN UINT32 LineNo)2287   CIfrUint16 (
2288   IN UINT32 LineNo
2289   ) : CIfrObj (EFI_IFR_UINT16_OP),
2290       CIfrOpHeader (EFI_IFR_UINT16_OP, &(GetObjBinAddr<EFI_IFR_UINT16>())->Header), mUint16(GetObjBinAddr<EFI_IFR_UINT16>()) {
2291     SetLineNo (LineNo);
2292   }
2293 
SetValue(IN UINT16 Value)2294   VOID SetValue (IN UINT16 Value) {
2295     mUint16->Value = Value;
2296   }
2297 };
2298 
2299 class CIfrUint32 : public CIfrObj, public CIfrOpHeader {
2300 private:
2301   EFI_IFR_UINT32 *mUint32;
2302 
2303 public:
CIfrUint32(IN UINT32 LineNo)2304   CIfrUint32 (
2305   IN UINT32 LineNo
2306   ) : CIfrObj (EFI_IFR_UINT32_OP),
2307       CIfrOpHeader (EFI_IFR_UINT32_OP, &(GetObjBinAddr<EFI_IFR_UINT32>())->Header), mUint32(GetObjBinAddr<EFI_IFR_UINT32>()) {
2308     SetLineNo (LineNo);
2309   }
2310 
SetValue(IN UINT32 Value)2311   VOID SetValue (IN UINT32 Value) {
2312     mUint32->Value = Value;
2313   }
2314 };
2315 
2316 class CIfrUint64 : public CIfrObj, public CIfrOpHeader {
2317 private:
2318   EFI_IFR_UINT64 *mUint64;
2319 
2320 public:
CIfrUint64(IN UINT32 LineNo)2321   CIfrUint64 (
2322   IN UINT32 LineNo
2323   ) : CIfrObj (EFI_IFR_UINT64_OP),
2324       CIfrOpHeader (EFI_IFR_UINT64_OP, &(GetObjBinAddr<EFI_IFR_UINT64>())->Header), mUint64(GetObjBinAddr<EFI_IFR_UINT64>()) {
2325     SetLineNo (LineNo);
2326   }
2327 
SetValue(IN UINT64 Value)2328   VOID SetValue (IN UINT64 Value) {
2329     mUint64->Value = Value;
2330   }
2331 };
2332 
2333 class CIfrTrue : public CIfrObj, public CIfrOpHeader {
2334 public:
CIfrTrue(IN UINT32 LineNo)2335   CIfrTrue (
2336   IN UINT32 LineNo
2337   ) : CIfrObj (EFI_IFR_TRUE_OP),
2338       CIfrOpHeader (EFI_IFR_TRUE_OP, &(GetObjBinAddr<EFI_IFR_TRUE>())->Header) {
2339     SetLineNo (LineNo);
2340   }
2341 };
2342 
2343 class CIfrFalse : public CIfrObj, public CIfrOpHeader {
2344 public:
CIfrFalse(IN UINT32 LineNo)2345   CIfrFalse (
2346   IN UINT32 LineNo
2347   ) : CIfrObj (EFI_IFR_FALSE_OP),
2348       CIfrOpHeader (EFI_IFR_FALSE_OP, &(GetObjBinAddr<EFI_IFR_FALSE>())->Header) {
2349     SetLineNo (LineNo);
2350   }
2351 };
2352 
2353 class CIfrOne : public CIfrObj, public CIfrOpHeader {
2354 public:
CIfrOne(IN UINT32 LineNo)2355   CIfrOne (
2356   IN UINT32 LineNo
2357   ) : CIfrObj (EFI_IFR_ONE_OP),
2358       CIfrOpHeader (EFI_IFR_ONE_OP, &(GetObjBinAddr<EFI_IFR_ONE>())->Header) {
2359     SetLineNo (LineNo);
2360   }
2361 };
2362 
2363 class CIfrOnes : public CIfrObj, public CIfrOpHeader {
2364 public:
CIfrOnes(IN UINT32 LineNo)2365   CIfrOnes (
2366   IN UINT32 LineNo
2367   ) : CIfrObj (EFI_IFR_ONES_OP),
2368       CIfrOpHeader (EFI_IFR_ONES_OP, &(GetObjBinAddr<EFI_IFR_ONES>())->Header) {
2369     SetLineNo (LineNo);
2370   }
2371 };
2372 
2373 class CIfrZero : public CIfrObj, public CIfrOpHeader {
2374 public:
CIfrZero(IN UINT32 LineNo)2375   CIfrZero (
2376   IN UINT32 LineNo
2377   ) : CIfrObj (EFI_IFR_ZERO_OP),
2378       CIfrOpHeader (EFI_IFR_ZERO_OP, &(GetObjBinAddr<EFI_IFR_ZERO>())->Header) {
2379     SetLineNo (LineNo);
2380   }
2381 };
2382 
2383 class CIfrUndefined : public CIfrObj, public CIfrOpHeader {
2384 public:
CIfrUndefined(IN UINT32 LineNo)2385   CIfrUndefined (
2386   IN UINT32 LineNo
2387   ) : CIfrObj (EFI_IFR_UNDEFINED_OP),
2388       CIfrOpHeader (EFI_IFR_UNDEFINED_OP, &(GetObjBinAddr<EFI_IFR_UNDEFINED>())->Header) {
2389     SetLineNo (LineNo);
2390   }
2391 };
2392 
2393 class CIfrVersion : public CIfrObj, public CIfrOpHeader {
2394 public:
CIfrVersion(IN UINT32 LineNo)2395   CIfrVersion (
2396   IN UINT32 LineNo
2397   ) : CIfrObj (EFI_IFR_VERSION_OP),
2398       CIfrOpHeader (EFI_IFR_VERSION_OP, &(GetObjBinAddr<EFI_IFR_VERSION>())->Header) {
2399     SetLineNo (LineNo);
2400   }
2401 };
2402 
2403 class CIfrLength : public CIfrObj, public CIfrOpHeader {
2404 public:
CIfrLength(IN UINT32 LineNo)2405   CIfrLength (
2406   IN UINT32 LineNo
2407   ) : CIfrObj (EFI_IFR_LENGTH_OP),
2408       CIfrOpHeader (EFI_IFR_LENGTH_OP, &(GetObjBinAddr<EFI_IFR_LENGTH>())->Header) {
2409     SetLineNo (LineNo);
2410   }
2411 };
2412 
2413 class CIfrNot : public CIfrObj, public CIfrOpHeader {
2414 public:
CIfrNot(IN UINT32 LineNo)2415   CIfrNot (
2416   IN UINT32 LineNo
2417   ) : CIfrObj (EFI_IFR_NOT_OP),
2418       CIfrOpHeader (EFI_IFR_NOT_OP, &(GetObjBinAddr<EFI_IFR_NOT>())->Header) {
2419     SetLineNo (LineNo);
2420   }
2421 };
2422 
2423 class CIfrBitWiseNot : public CIfrObj, public CIfrOpHeader {
2424 public:
CIfrBitWiseNot(IN UINT32 LineNo)2425   CIfrBitWiseNot (
2426   IN UINT32 LineNo
2427   ) : CIfrObj (EFI_IFR_BITWISE_NOT_OP),
2428       CIfrOpHeader (EFI_IFR_BITWISE_NOT_OP, &(GetObjBinAddr<EFI_IFR_BITWISE_NOT>())->Header) {
2429     SetLineNo (LineNo);
2430   }
2431 };
2432 
2433 class CIfrToBoolean : public CIfrObj, public CIfrOpHeader {
2434 public:
CIfrToBoolean(IN UINT32 LineNo)2435   CIfrToBoolean (
2436   IN UINT32 LineNo
2437   ) : CIfrObj (EFI_IFR_TO_BOOLEAN_OP),
2438       CIfrOpHeader (EFI_IFR_TO_BOOLEAN_OP, &(GetObjBinAddr<EFI_IFR_TO_BOOLEAN>())->Header) {
2439     SetLineNo (LineNo);
2440   }
2441 };
2442 
2443 class CIfrToString : public CIfrObj, public CIfrOpHeader {
2444 private:
2445   EFI_IFR_TO_STRING *mToString;
2446 
2447 public:
CIfrToString(IN UINT32 LineNo)2448   CIfrToString (
2449   IN UINT32 LineNo
2450   ) : CIfrObj (EFI_IFR_TO_STRING_OP),
2451       CIfrOpHeader (EFI_IFR_TO_STRING_OP, &(GetObjBinAddr<EFI_IFR_TO_STRING>())->Header), mToString(GetObjBinAddr<EFI_IFR_TO_STRING>()) {
2452     SetLineNo (LineNo);
2453   }
2454 
SetFormat(IN UINT8 Format)2455   VOID SetFormat (IN UINT8 Format) {
2456     mToString->Format = Format;
2457   }
2458 };
2459 
2460 class CIfrToUint : public CIfrObj, public CIfrOpHeader {
2461 public:
CIfrToUint(IN UINT32 LineNo)2462   CIfrToUint (
2463   IN UINT32 LineNo
2464   ) : CIfrObj (EFI_IFR_TO_UINT_OP),
2465       CIfrOpHeader (EFI_IFR_TO_UINT_OP, &(GetObjBinAddr<EFI_IFR_TO_UINT>())->Header) {
2466     SetLineNo (LineNo);
2467   }
2468 };
2469 
2470 class CIfrToUpper : public CIfrObj, public CIfrOpHeader {
2471 public:
CIfrToUpper(IN UINT32 LineNo)2472   CIfrToUpper (
2473   IN UINT32 LineNo
2474   ) : CIfrObj (EFI_IFR_TO_UPPER_OP),
2475       CIfrOpHeader (EFI_IFR_TO_UPPER_OP, &(GetObjBinAddr<EFI_IFR_TO_UPPER>())->Header) {
2476     SetLineNo (LineNo);
2477   }
2478 };
2479 
2480 class CIfrToLower : public CIfrObj, public CIfrOpHeader {
2481 public:
CIfrToLower(IN UINT32 LineNo)2482   CIfrToLower (
2483   IN UINT32 LineNo
2484   ) : CIfrObj (EFI_IFR_TO_LOWER_OP),
2485       CIfrOpHeader (EFI_IFR_TO_LOWER_OP, &(GetObjBinAddr<EFI_IFR_TO_LOWER>())->Header) {
2486     SetLineNo (LineNo);
2487   }
2488 };
2489 
2490 class CIfrAdd : public CIfrObj, public CIfrOpHeader {
2491 public:
CIfrAdd(IN UINT32 LineNo)2492   CIfrAdd (
2493   IN UINT32 LineNo
2494   ) : CIfrObj (EFI_IFR_ADD_OP),
2495       CIfrOpHeader (EFI_IFR_ADD_OP, &(GetObjBinAddr<EFI_IFR_ADD>())->Header) {
2496     SetLineNo (LineNo);
2497   }
2498 };
2499 
2500 class CIfrBitWiseAnd : public CIfrObj, public CIfrOpHeader {
2501 public:
CIfrBitWiseAnd(IN UINT32 LineNo)2502   CIfrBitWiseAnd (
2503   IN UINT32 LineNo
2504   ) : CIfrObj (EFI_IFR_BITWISE_AND_OP),
2505       CIfrOpHeader (EFI_IFR_BITWISE_AND_OP, &(GetObjBinAddr<EFI_IFR_BITWISE_AND>())->Header) {
2506     SetLineNo(LineNo);
2507   }
2508 };
2509 
2510 class CIfrBitWiseOr : public CIfrObj, public CIfrOpHeader {
2511 public:
CIfrBitWiseOr(IN UINT32 LineNo)2512   CIfrBitWiseOr (
2513   IN UINT32 LineNo
2514   ) : CIfrObj (EFI_IFR_BITWISE_OR_OP),
2515       CIfrOpHeader (EFI_IFR_BITWISE_OR_OP, &(GetObjBinAddr<EFI_IFR_BITWISE_OR>())->Header) {
2516     SetLineNo (LineNo);
2517   }
2518 };
2519 
2520 class CIfrAnd : public CIfrObj, public CIfrOpHeader {
2521 public:
CIfrAnd(IN UINT32 LineNo)2522   CIfrAnd (
2523   IN UINT32 LineNo
2524   ) : CIfrObj (EFI_IFR_AND_OP),
2525       CIfrOpHeader (EFI_IFR_AND_OP, &(GetObjBinAddr<EFI_IFR_AND>())->Header) {
2526     SetLineNo (LineNo);
2527   }
2528 };
2529 
2530 class CIfrCatenate : public CIfrObj, public CIfrOpHeader {
2531 public:
CIfrCatenate(IN UINT32 LineNo)2532   CIfrCatenate (
2533   IN UINT32 LineNo
2534   ) : CIfrObj (EFI_IFR_CATENATE_OP),
2535       CIfrOpHeader (EFI_IFR_CATENATE_OP, &(GetObjBinAddr<EFI_IFR_CATENATE>())->Header) {
2536     SetLineNo (LineNo);
2537   }
2538 };
2539 
2540 class CIfrDivide : public CIfrObj, public CIfrOpHeader {
2541 public:
CIfrDivide(IN UINT32 LineNo)2542   CIfrDivide (
2543   IN UINT32 LineNo
2544   ) : CIfrObj (EFI_IFR_DIVIDE_OP),
2545       CIfrOpHeader (EFI_IFR_DIVIDE_OP, &(GetObjBinAddr<EFI_IFR_DIVIDE>())->Header) {
2546     SetLineNo (LineNo);
2547   }
2548 };
2549 
2550 class CIfrEqual : public CIfrObj, public CIfrOpHeader {
2551 public:
CIfrEqual(IN UINT32 LineNo)2552   CIfrEqual (
2553   IN UINT32 LineNo
2554   ) : CIfrObj (EFI_IFR_EQUAL_OP),
2555       CIfrOpHeader (EFI_IFR_EQUAL_OP, &(GetObjBinAddr<EFI_IFR_EQUAL>())->Header) {
2556     SetLineNo (LineNo);
2557   }
2558 };
2559 
2560 class CIfrGreaterEqual : public CIfrObj, public CIfrOpHeader {
2561 public:
CIfrGreaterEqual(IN UINT32 LineNo)2562   CIfrGreaterEqual (
2563   IN UINT32 LineNo
2564   ) : CIfrObj (EFI_IFR_GREATER_EQUAL_OP),
2565       CIfrOpHeader (EFI_IFR_GREATER_EQUAL_OP, &(GetObjBinAddr<EFI_IFR_GREATER_EQUAL>())->Header) {
2566     SetLineNo (LineNo);
2567   }
2568 };
2569 
2570 class CIfrGreaterThan : public CIfrObj, public CIfrOpHeader {
2571 public:
CIfrGreaterThan(IN UINT32 LineNo)2572   CIfrGreaterThan (
2573   IN UINT32 LineNo
2574   ) : CIfrObj (EFI_IFR_GREATER_THAN_OP),
2575       CIfrOpHeader (EFI_IFR_GREATER_THAN_OP, &(GetObjBinAddr<EFI_IFR_GREATER_THAN>())->Header) {
2576     SetLineNo (LineNo);
2577   }
2578 };
2579 
2580 class CIfrLessEqual : public CIfrObj, public CIfrOpHeader {
2581 public:
CIfrLessEqual(IN UINT32 LineNo)2582   CIfrLessEqual (
2583   IN UINT32 LineNo
2584   ) : CIfrObj (EFI_IFR_LESS_EQUAL_OP),
2585       CIfrOpHeader (EFI_IFR_LESS_EQUAL_OP, &(GetObjBinAddr<EFI_IFR_LESS_EQUAL>())->Header) {
2586     SetLineNo (LineNo);
2587   }
2588 };
2589 
2590 class CIfrLessThan : public CIfrObj, public CIfrOpHeader {
2591 public:
CIfrLessThan(IN UINT32 LineNo)2592   CIfrLessThan (
2593   IN UINT32 LineNo
2594   ) : CIfrObj (EFI_IFR_LESS_THAN_OP),
2595       CIfrOpHeader (EFI_IFR_LESS_THAN_OP, &(GetObjBinAddr<EFI_IFR_LESS_THAN>())->Header) {
2596     SetLineNo (LineNo);
2597   }
2598 };
2599 
2600 class CIfrMap : public CIfrObj, public CIfrOpHeader{
2601 public:
CIfrMap(IN UINT32 LineNo)2602   CIfrMap (
2603   IN UINT32 LineNo
2604   ) : CIfrObj (EFI_IFR_MAP_OP),
2605       CIfrOpHeader (EFI_IFR_MAP_OP, &(GetObjBinAddr<EFI_IFR_MAP>())->Header) {
2606     SetLineNo (LineNo);
2607   }
2608 };
2609 
2610 class CIfrMatch : public CIfrObj, public CIfrOpHeader {
2611 public:
CIfrMatch(IN UINT32 LineNo)2612   CIfrMatch (
2613   IN UINT32 LineNo
2614   ) : CIfrObj (EFI_IFR_MATCH_OP),
2615       CIfrOpHeader (EFI_IFR_MATCH_OP, &(GetObjBinAddr<EFI_IFR_MATCH>())->Header) {
2616     SetLineNo (LineNo);
2617   }
2618 };
2619 
2620 class CIfrMatch2 : public CIfrObj, public CIfrOpHeader {
2621 private:
2622   EFI_IFR_MATCH2 *mMatch2;
2623 
2624 public:
CIfrMatch2(IN UINT32 LineNo,IN EFI_GUID * Guid)2625   CIfrMatch2 (
2626   IN UINT32   LineNo,
2627   IN EFI_GUID *Guid
2628   ) : CIfrObj (EFI_IFR_MATCH2_OP),
2629       CIfrOpHeader (EFI_IFR_MATCH2_OP, &(GetObjBinAddr<EFI_IFR_MATCH2>())->Header), mMatch2(GetObjBinAddr<EFI_IFR_MATCH2>()) {
2630     SetLineNo (LineNo);
2631     memmove (&mMatch2->SyntaxType, Guid, sizeof (EFI_GUID));
2632   }
2633 };
2634 
2635 class CIfrMultiply : public CIfrObj, public CIfrOpHeader {
2636 public:
CIfrMultiply(IN UINT32 LineNo)2637   CIfrMultiply (
2638   IN UINT32 LineNo
2639   ) : CIfrObj (EFI_IFR_MULTIPLY_OP),
2640       CIfrOpHeader (EFI_IFR_MULTIPLY_OP, &(GetObjBinAddr<EFI_IFR_MULTIPLY>())->Header) {
2641     SetLineNo (LineNo);
2642   }
2643 };
2644 
2645 class CIfrModulo : public CIfrObj, public CIfrOpHeader {
2646 public:
CIfrModulo(IN UINT32 LineNo)2647   CIfrModulo (
2648   IN UINT32 LineNo
2649   ) : CIfrObj (EFI_IFR_MODULO_OP),
2650       CIfrOpHeader (EFI_IFR_MODULO_OP, &(GetObjBinAddr<EFI_IFR_MODULO>())->Header) {
2651     SetLineNo (LineNo);
2652   }
2653 };
2654 
2655 class CIfrNotEqual : public CIfrObj, public CIfrOpHeader {
2656 public:
CIfrNotEqual(IN UINT32 LineNo)2657   CIfrNotEqual (
2658   IN UINT32 LineNo
2659   ) : CIfrObj (EFI_IFR_NOT_EQUAL_OP),
2660       CIfrOpHeader (EFI_IFR_NOT_EQUAL_OP, &(GetObjBinAddr<EFI_IFR_NOT_EQUAL>())->Header) {
2661     SetLineNo (LineNo);
2662   }
2663 };
2664 
2665 class CIfrOr : public CIfrObj, public CIfrOpHeader {
2666 public:
CIfrOr(IN UINT32 LineNo)2667   CIfrOr (
2668   IN UINT32 LineNo
2669   ) : CIfrObj (EFI_IFR_OR_OP),
2670       CIfrOpHeader (EFI_IFR_OR_OP, &(GetObjBinAddr<EFI_IFR_OR>())->Header) {
2671     SetLineNo (LineNo);
2672   }
2673 };
2674 
2675 class CIfrShiftLeft : public CIfrObj, public CIfrOpHeader {
2676 public:
CIfrShiftLeft(IN UINT32 LineNo)2677   CIfrShiftLeft (
2678   IN UINT32 LineNo
2679   ) : CIfrObj (EFI_IFR_SHIFT_LEFT_OP),
2680       CIfrOpHeader (EFI_IFR_SHIFT_LEFT_OP, &(GetObjBinAddr<EFI_IFR_SHIFT_LEFT>())->Header) {
2681     SetLineNo (LineNo);
2682   }
2683 };
2684 
2685 class CIfrShiftRight : public CIfrObj, public CIfrOpHeader {
2686 public:
CIfrShiftRight(IN UINT32 LineNo)2687   CIfrShiftRight (
2688   IN UINT32 LineNo
2689   ) : CIfrObj (EFI_IFR_SHIFT_RIGHT_OP),
2690       CIfrOpHeader (EFI_IFR_SHIFT_RIGHT_OP, &(GetObjBinAddr<EFI_IFR_SHIFT_RIGHT>())->Header) {
2691     SetLineNo (LineNo);
2692   }
2693 };
2694 
2695 class CIfrSubtract : public CIfrObj, public CIfrOpHeader {
2696 public:
CIfrSubtract(IN UINT32 LineNo)2697   CIfrSubtract (
2698   IN UINT32 LineNo
2699   ) : CIfrObj (EFI_IFR_SUBTRACT_OP),
2700       CIfrOpHeader (EFI_IFR_SUBTRACT_OP, &(GetObjBinAddr<EFI_IFR_SUBTRACT>())->Header) {
2701     SetLineNo (LineNo);
2702   }
2703 };
2704 
2705 class CIfrConditional : public CIfrObj, public CIfrOpHeader {
2706 public:
CIfrConditional(IN UINT32 LineNo)2707   CIfrConditional (
2708   IN UINT32 LineNo
2709   ) : CIfrObj (EFI_IFR_CONDITIONAL_OP),
2710       CIfrOpHeader (EFI_IFR_CONDITIONAL_OP, &(GetObjBinAddr<EFI_IFR_CONDITIONAL>())->Header) {
2711     SetLineNo (LineNo);
2712   }
2713 };
2714 
2715 class CIfrFind : public CIfrObj, public CIfrOpHeader {
2716 private:
2717   EFI_IFR_FIND *mFind;
2718 
2719 public:
CIfrFind(IN UINT32 LineNo)2720   CIfrFind (
2721   IN UINT32 LineNo
2722   ) : CIfrObj (EFI_IFR_FIND_OP),
2723       CIfrOpHeader (EFI_IFR_FIND_OP, &(GetObjBinAddr<EFI_IFR_FIND>())->Header), mFind(GetObjBinAddr<EFI_IFR_FIND>()) {
2724     SetLineNo (LineNo);
2725   }
2726 
SetFormat(IN UINT8 Format)2727   VOID SetFormat (IN UINT8 Format) {
2728     mFind->Format = Format;
2729   }
2730 };
2731 
2732 class CIfrMid : public CIfrObj, public CIfrOpHeader {
2733 public:
CIfrMid(IN UINT32 LineNo)2734   CIfrMid (
2735   IN UINT32 LineNo
2736   ) : CIfrObj (EFI_IFR_MID_OP),
2737       CIfrOpHeader (EFI_IFR_MID_OP, &(GetObjBinAddr<EFI_IFR_MID>())->Header) {
2738     SetLineNo (LineNo);
2739   }
2740 };
2741 
2742 class CIfrToken : public CIfrObj, public CIfrOpHeader {
2743 public:
CIfrToken(IN UINT32 LineNo)2744   CIfrToken (
2745   IN UINT32 LineNo
2746   ) : CIfrObj (EFI_IFR_TOKEN_OP),
2747       CIfrOpHeader (EFI_IFR_TOKEN_OP, &(GetObjBinAddr<EFI_IFR_TOKEN>())->Header) {
2748     SetLineNo (LineNo);
2749   }
2750 };
2751 
2752 class CIfrSpan : public CIfrObj, public CIfrOpHeader {
2753 private:
2754   EFI_IFR_SPAN *mSpan;
2755 
2756 public:
CIfrSpan(IN UINT32 LineNo)2757   CIfrSpan (
2758   IN UINT32 LineNo
2759   ) : CIfrObj (EFI_IFR_SPAN_OP),
2760       CIfrOpHeader (EFI_IFR_SPAN_OP, &(GetObjBinAddr<EFI_IFR_SPAN>())->Header), mSpan(GetObjBinAddr<EFI_IFR_SPAN>()) {
2761     SetLineNo (LineNo);
2762     mSpan->Flags = EFI_IFR_FLAGS_FIRST_MATCHING;
2763   }
2764 
SetFlags(IN UINT8 LFlags)2765   EFI_VFR_RETURN_CODE SetFlags (IN UINT8 LFlags) {
2766     if (_IS_EQUAL (LFlags, EFI_IFR_FLAGS_FIRST_MATCHING)) {
2767       mSpan->Flags |= EFI_IFR_FLAGS_FIRST_MATCHING;
2768     } else if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_IFR_FLAGS_FIRST_NON_MATCHING)) {
2769       mSpan->Flags |= EFI_IFR_FLAGS_FIRST_NON_MATCHING;
2770     }
2771 
2772     return _FLAGS_ZERO (LFlags) ? VFR_RETURN_SUCCESS : VFR_RETURN_FLAGS_UNSUPPORTED;
2773   }
2774 };
2775 
2776 #endif
2777