]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/C/VfrCompile/VfrFormPkg.h
BaseTools/Pccts: Resolve GCC sting format mismatch build warning
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrFormPkg.h
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 */
34 static inline BOOLEAN _FLAGS_ZERO (
35 IN UINT8 &Flags
36 )
37 {
38 return Flags == 0;
39 }
40
41 static inline VOID _FLAG_CLEAR (
42 IN UINT8 &Flags,
43 IN UINT8 Mask
44 )
45 {
46 Flags &= (~Mask);
47 }
48
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
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
224 inline VOID TurnOn (VOID) {
225 mSwitch = TRUE;
226 }
227
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
277 inline VOID SetLineNo (IN UINT32 LineNo) {
278 mLineNo = LineNo;
279 }
280
281 inline CHAR8 * GetObjBinAddr (VOID) {
282 return mObjBinBuf;
283 }
284
285 inline UINT32 GetObjBinOffset (VOID) {
286 return mPkgOffset;
287 }
288
289 inline UINT8 GetObjBinLen (VOID) {
290 return mObjBinLen;
291 }
292
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
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
324 VOID IncLength (UINT8 Size) {
325 if ((mHeader->Length + Size) > mHeader->Length) {
326 mHeader->Length = mHeader->Length + Size;
327 }
328 }
329
330 VOID DecLength (UINT8 Size) {
331 if (mHeader->Length >= Size) {
332 mHeader->Length -= Size;
333 }
334 }
335
336 UINT8 GetLength () {
337 return mHeader->Length;
338 }
339
340 UINT8 GetScope () {
341 return mHeader->Scope;
342 }
343
344 VOID SetScope (IN UINT8 Scope) {
345 mHeader->Scope = Scope;
346 }
347
348 VOID UpdateHeader (IN EFI_IFR_OP_HEADER *Header) {
349 mHeader = Header;
350 }
351
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:
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
375 EFI_IFR_STATEMENT_HEADER *GetStatementHeader () {
376 return mHeader;
377 }
378
379 VOID SetPrompt (IN EFI_STRING_ID Prompt) {
380 mHeader->Prompt = Prompt;
381 }
382
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
397 EFI_IFR_STATEMENT_HEADER * QH2SH (EFI_IFR_QUESTION_HEADER *Qheader) {
398 return &(Qheader)->Header;
399 }
400
401 public:
402 EFI_QUESTION_ID QUESTION_ID (VOID) {
403 return mHeader->QuestionId;
404 }
405
406 EFI_VARSTORE_ID VARSTORE_ID (VOID) {
407 return mHeader->VarStoreId;
408 }
409
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
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
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
434 VOID SetQuestionId (IN EFI_QUESTION_ID QuestionId) {
435 mHeader->QuestionId = QuestionId;
436 }
437
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
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
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:
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
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
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
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
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
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
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
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
633 BOOLEAN IsNumericOpcode () {
634 return IsNumeric;
635 }
636
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:
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
665 VOID SetGuid (IN EFI_GUID *Guid) {
666 memmove (&mFormSet->Guid, Guid, sizeof (EFI_GUID));
667 }
668
669 VOID SetFormSetTitle (IN EFI_STRING_ID FormSetTitle) {
670 mFormSet->FormSetTitle = FormSetTitle;
671 }
672
673 VOID SetHelp (IN EFI_STRING_ID Help) {
674 mFormSet->Help = Help;
675 }
676
677 VOID SetClassGuid (IN EFI_GUID *Guid) {
678 memmove (&(mClassGuid[mFormSet->Flags++]), Guid, sizeof (EFI_GUID));
679 }
680
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:
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:
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
706 VOID SetDefaultName (IN EFI_STRING_ID DefaultName) {
707 mDefaultStore->DefaultName = DefaultName;
708 }
709
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
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
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:
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
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
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:
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
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
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:
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
819 VOID SetGuid (IN EFI_GUID *Guid) {
820 memmove (&mVarStore->Guid, Guid, sizeof (EFI_GUID));
821 }
822
823 VOID SetVarStoreId (IN EFI_VARSTORE_ID VarStoreId) {
824 mVarStore->VarStoreId = VarStoreId;
825 }
826
827 VOID SetSize (IN UINT16 Size) {
828 mVarStore->Size = Size;
829 }
830
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:
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
859 VOID SetGuid (IN EFI_GUID *Guid) {
860 memmove (&mVarStoreEfi->Guid, Guid, sizeof (EFI_GUID));
861 }
862
863 VOID SetVarStoreId (IN UINT16 VarStoreId) {
864 mVarStoreEfi->VarStoreId = VarStoreId;
865 }
866
867 VOID SetAttributes (IN UINT32 Attributes) {
868 mVarStoreEfi->Attributes = Attributes;
869 }
870 VOID SetSize (IN UINT16 Size) {
871 mVarStoreEfi->Size = Size;
872 }
873
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
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:
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
913 VOID SetGuid (IN EFI_GUID *Guid) {
914 memmove (&mVarStoreNameValue->Guid, Guid, sizeof (EFI_GUID));
915 }
916
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:
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
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:
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:
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:
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
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
992 VOID SetDefaultId (IN UINT16 DefaultId) {
993 mDefault->DefaultId = DefaultId;
994 }
995
996 VOID SetType (IN UINT8 Type) {
997 mDefault->Type = Type;
998 }
999
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
1019 VOID SetDefaultId (IN UINT16 DefaultId) {
1020 mDefault->DefaultId = DefaultId;
1021 }
1022
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:
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:
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:
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:
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
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:
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
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:
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
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:
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
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:
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
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:
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
1162 VOID SetFormId (IN EFI_FORM_ID FormId) {
1163 mRef2->FormId = FormId;
1164 }
1165
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:
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
1184 VOID SetFormId (IN EFI_FORM_ID FormId) {
1185 mRef3->FormId = FormId;
1186 }
1187
1188 VOID SetQuestionId (IN EFI_QUESTION_ID QuestionId) {
1189 mRef3->QuestionId = QuestionId;
1190 }
1191
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:
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
1211 VOID SetFormId (IN EFI_FORM_ID FormId) {
1212 mRef4->FormId = FormId;
1213 }
1214
1215 VOID SetQuestionId (IN EFI_QUESTION_ID QuestionId) {
1216 mRef4->QuestionId = QuestionId;
1217 }
1218
1219 VOID SetFormSetId (IN EFI_GUID FormSetId) {
1220 mRef4->FormSetId = FormSetId;
1221 }
1222
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:
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:
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
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:
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
1267 ~CIfrCheckBox () {
1268 gCurrentQuestion = NULL;
1269 }
1270
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
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:
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
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:
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
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:
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
1368 ~CIfrNumeric () {
1369 gCurrentQuestion = NULL;
1370 gCurrentMinMaxData = NULL;
1371 }
1372
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
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:
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
1429 ~CIfrOneOf () {
1430 gCurrentQuestion = NULL;
1431 gCurrentMinMaxData = NULL;
1432 }
1433
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
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:
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
1486 ~CIfrString () {
1487 gCurrentQuestion = NULL;
1488 }
1489
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
1505 VOID SetMinSize (IN UINT8 Flags) {
1506 mString->MinSize = Flags;
1507 }
1508
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:
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
1527 ~CIfrPassword () {
1528 gCurrentQuestion = NULL;
1529 }
1530
1531 VOID SetMinSize (IN UINT16 MinSize) {
1532 mPassword->MinSize = MinSize;
1533 }
1534
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:
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
1553 ~CIfrOrderedList () {
1554 gCurrentQuestion = NULL;
1555 }
1556
1557 VOID SetMaxContainers (IN UINT8 MaxContainers) {
1558 mOrderedList->MaxContainers = MaxContainers;
1559 }
1560
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:
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
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:
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:
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:
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:
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
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:
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
1678 VOID SetWarning (IN EFI_STRING_ID Warning) {
1679 mWarningIf->Warning = Warning;
1680 }
1681
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:
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
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:
1707 CIfrRefresh () : CIfrObj (EFI_IFR_REFRESH_OP, (CHAR8 **)&mRefresh),
1708 CIfrOpHeader (EFI_IFR_REFRESH_OP, &mRefresh->Header) {
1709 mRefresh->RefreshInterval = 0;
1710 }
1711
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:
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
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:
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
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:
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
1760 VOID SetOption (IN EFI_STRING_ID Option) {
1761 mOneOfOption->Option = Option;
1762 }
1763
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
1806 VOID SetType (IN UINT8 Type) {
1807 mOneOfOption->Type = Type;
1808 }
1809
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
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:
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
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:
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
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:
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
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:
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
1883 VOID SetTitle (IN EFI_STRING_ID StringId) {
1884 mBanner->Title = StringId;
1885 }
1886
1887 VOID SetLine (IN UINT16 Line) {
1888 mBanner->LineNumber = Line;
1889 }
1890
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:
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:
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
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:
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
1959 VOID SetGuid (IN EFI_GUID *Guid) {
1960 memmove (&mGuid->Guid, Guid, sizeof (EFI_GUID));
1961 }
1962
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:
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:
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
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
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:
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
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
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:
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
2065 VOID UpdateIfrBuffer (
2066 ) {
2067 _EMIT_PENDING_OBJ();
2068 mEqIdVList = (EFI_IFR_EQ_ID_VAL_LIST *) GetObjBinAddr();
2069 UpdateHeader (&mEqIdVList->Header);
2070 }
2071
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
2084 VOID SetListLength (IN UINT16 ListLength) {
2085 mEqIdVList->ListLength = ListLength;
2086 }
2087
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:
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
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:
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:
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:
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
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:
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
2185 VOID SetDevicePath (IN EFI_STRING_ID DevicePath) {
2186 mQuestionRef3_3->DevicePath = DevicePath;
2187 }
2188
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:
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
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:
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
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:
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:
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:
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
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:
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
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:
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
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:
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
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:
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
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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
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:
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:
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:
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
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