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