]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/VfrCompile/VfrFormPkg.h
BaseTools/Pccts: Resolve GCC sting format mismatch build warning
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrFormPkg.h
index 38422e1332f85636b628fc491908834f16d229fe..17ab14c021dfacea7f4f1d064bc335dc90306979 100644 (file)
@@ -2,8 +2,8 @@
   \r
   The definition of CFormPkg's member function\r
 \r
-Copyright (c) 2004 - 2010, Intel Corporation                                                         \r
-All rights reserved. This program and the accompanying materials                          \r
+Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials                          \r
 are licensed and made available under the terms and conditions of the BSD License         \r
 which accompanies this distribution.  The full text of the license may be found at        \r
 http://opensource.org/licenses/bsd-license.php                                            \r
@@ -87,6 +87,10 @@ struct SPendingAssign {
   VOID   SetAddrAndLen (IN VOID *, IN UINT32);\r
   VOID   AssignValue (IN VOID *, IN UINT32);\r
   CHAR8 * GetKey (VOID);\r
+\r
+private:\r
+  SPendingAssign (IN CONST SPendingAssign&);             // Prevent copy-construction\r
+  SPendingAssign& operator= (IN CONST SPendingAssign&);  // Prevent assignment\r
 };\r
 \r
 struct SBufferNode {\r
@@ -96,6 +100,11 @@ struct SBufferNode {
   struct SBufferNode *mNext;\r
 };\r
 \r
+typedef struct {\r
+  BOOLEAN  CompatibleMode;\r
+  EFI_GUID *OverrideClassGuid;\r
+} INPUT_INFO_TO_SYNTAX;\r
+\r
 class CFormPkg {\r
 private:\r
   UINT32              mBufferSize;\r
@@ -110,12 +119,16 @@ private:
 \r
   VOID                _WRITE_PKG_LINE (IN FILE *, IN UINT32 , IN CONST CHAR8 *, IN CHAR8 *, IN UINT32);\r
   VOID                _WRITE_PKG_END (IN FILE *, IN UINT32 , IN CONST CHAR8 *, IN CHAR8 *, IN UINT32);\r
+  SBufferNode *       GetBinBufferNodeForAddr (IN CHAR8 *);\r
+  SBufferNode *       CreateNewNode ();\r
+  SBufferNode *       GetNodeBefore (IN SBufferNode *);\r
+  EFI_VFR_RETURN_CODE InsertNodeBefore (IN SBufferNode *, IN SBufferNode *);\r
 \r
 private:\r
   SPendingAssign      *PendingAssignList;\r
 \r
 public:\r
-  CFormPkg (IN UINT32 BufferSize);\r
+  CFormPkg (IN UINT32 BufferSize = 4096);\r
   ~CFormPkg ();\r
 \r
   CHAR8             * IfrBinBufferGet (IN UINT32);\r
@@ -130,6 +143,10 @@ public:
   EFI_VFR_RETURN_CODE BuildPkg (OUT PACKAGE_DATA &);\r
   EFI_VFR_RETURN_CODE GenCFile (IN CHAR8 *, IN FILE *, IN PACKAGE_DATA *PkgData = NULL);\r
 \r
+private:\r
+  CFormPkg (IN CONST CFormPkg&);             // Prevent copy-construction\r
+  CFormPkg& operator= (IN CONST CFormPkg&);  // Prevent assignment\r
+\r
 public:\r
   EFI_VFR_RETURN_CODE AssignPending (IN CHAR8 *, IN VOID *, IN UINT32, IN UINT32, IN CONST CHAR8 *Msg = NULL);\r
   VOID                DoPendingAssign (IN CHAR8 *, IN VOID *, IN UINT32);\r
@@ -140,11 +157,23 @@ public:
     IN CVfrDataStorage     &lCVfrDataStorage,\r
     IN CVfrQuestionDB      &lCVfrQuestionDB,\r
     IN EFI_GUID            *LocalFormSetGuid,\r
-    IN UINT32 LineNo\r
+    IN UINT32              LineNo,\r
+    OUT CHAR8              **InsertOpcodeAddr\r
+    );\r
+  EFI_VFR_RETURN_CODE AdjustDynamicInsertOpcode (\r
+    IN CHAR8              *LastFormEndAddr,\r
+    IN CHAR8              *InsertOpcodeAddr,\r
+    IN BOOLEAN            CreateOpcodeAfterParsingVfr\r
+    );\r
+  CHAR8 *             GetBufAddrBaseOnOffset (\r
+    IN UINT32             Offset\r
     );\r
 };\r
 \r
-extern CFormPkg gCFormPkg;\r
+extern CFormPkg       gCFormPkg;\r
+extern CVfrStringDB   gCVfrStringDB;\r
+extern UINT32         gAdjustOpcodeOffset;\r
+extern BOOLEAN        gNeedAdjustOpcode;\r
 \r
 struct SIfrRecord {\r
   UINT32     mLineNo;\r
@@ -157,8 +186,23 @@ struct SIfrRecord {
   ~SIfrRecord (VOID);\r
 };\r
 \r
+\r
 #define EFI_IFR_RECORDINFO_IDX_INVALUD 0xFFFFFF\r
 #define EFI_IFR_RECORDINFO_IDX_START   0x0\r
+#define EFI_HII_MAX_SUPPORT_DEFAULT_TYPE  0x08\r
+\r
+struct QuestionDefaultRecord {\r
+  BOOLEAN     mIsDefaultIdExist[EFI_HII_MAX_SUPPORT_DEFAULT_TYPE]; // Record the default id in mAllDefaultIdArray[EFI_HII_MAX_SUPPORT_DEFAULT_TYPE]\r
+                                                                   // whether exists in current question.\r
+\r
+  SIfrRecord  *mDefaultValueRecord;   // Point to the default value record in RecordList which has smallest default Id.\r
+                                      // (for checkbox it may be NULL, because the dedault value is always true when the flag is set.)\r
+\r
+  BOOLEAN     mIsDefaultOpcode;       // whether the default value with smallest default id is given by default opcode.\r
+                                      // (for oneof and checkbox default info may be given by flag.)\r
+\r
+  UINT16      mDefaultNumber;         // The default number of this question.\r
+};\r
 \r
 class CIfrRecordInfoDB {\r
 private:\r
@@ -166,6 +210,8 @@ private:
   UINT32     mRecordCount;\r
   SIfrRecord *mIfrRecordListHead;\r
   SIfrRecord *mIfrRecordListTail;\r
+  UINT8      mAllDefaultTypeCount;\r
+  UINT16     mAllDefaultIdArray[EFI_HII_MAX_SUPPORT_DEFAULT_TYPE];\r
 \r
   SIfrRecord * GetRecordInfoFromIdx (IN UINT32);\r
   BOOLEAN          CheckQuestionOpCode (IN UINT8);\r
@@ -183,11 +229,26 @@ public:
     mSwitch = FALSE;\r
   }\r
 \r
+  SIfrRecord * GetRecordInfoFromOffset (IN UINT32);\r
+  VOID        IfrAdjustOffsetForRecord (VOID);\r
+  BOOLEAN     IfrAdjustDynamicOpcodeInRecords (IN BOOLEAN);\r
+\r
   UINT32      IfrRecordRegister (IN UINT32, IN CHAR8 *, IN UINT8, IN UINT32);\r
   VOID        IfrRecordInfoUpdate (IN UINT32, IN UINT32, IN CHAR8*, IN UINT8, IN UINT32);\r
   VOID        IfrRecordOutput (IN FILE *, IN UINT32 LineNo);\r
   VOID        IfrRecordOutput (OUT PACKAGE_DATA &);\r
-  EFI_VFR_RETURN_CODE  IfrRecordAdjust (VOID);   \r
+  EFI_VFR_RETURN_CODE  IfrRecordAdjust (VOID);\r
+  VOID        IfrUpdateRecordInfoForDynamicOpcode (IN BOOLEAN);\r
+  VOID        IfrCheckAddDefaultRecord (IN BOOLEAN, IN BOOLEAN);\r
+  VOID        IfrGetDefaultStoreInfo ();\r
+  VOID        IfrCreateDefaultRecord (IN UINT8 Size,IN UINT16 DefaultId,IN UINT8 Type,IN UINT32 LineNo,IN EFI_IFR_TYPE_VALUE Value);\r
+  VOID        IfrCreateDefaultForQuestion (IN  SIfrRecord *, IN  QuestionDefaultRecord *);\r
+  VOID        IfrParseDefaulInfoInQuestion (IN  SIfrRecord *, OUT QuestionDefaultRecord *);\r
+  VOID        IfrAddDefaultToBufferConfig (IN  UINT16, IN  SIfrRecord *,IN  EFI_IFR_TYPE_VALUE);\r
+\r
+private:\r
+  CIfrRecordInfoDB (IN CONST CIfrRecordInfoDB&);             // Prevent copy-construction\r
+  CIfrRecordInfoDB& operator= (IN CONST CIfrRecordInfoDB&);  // Prevent assignment\r
 };\r
 \r
 extern CIfrRecordInfoDB gCIfrRecordInfoDB;\r
@@ -221,6 +282,10 @@ public:
     return mObjBinBuf;\r
   }\r
 \r
+  inline UINT32 GetObjBinOffset (VOID) {\r
+    return mPkgOffset;\r
+  }\r
+\r
   inline UINT8   GetObjBinLen (VOID) {\r
     return mObjBinLen;\r
   }\r
@@ -233,6 +298,15 @@ public:
       return FALSE;\r
     }\r
   }\r
+\r
+  inline bool ShrinkObjBin (IN UINT8 Size) {\r
+    if ((mDelayEmit == TRUE) && (mObjBinLen > Size)) {\r
+      mObjBinLen -= Size;\r
+      return TRUE;\r
+    } else {\r
+      return FALSE;\r
+    }\r
+  }\r
 };\r
 \r
 /*\r
@@ -245,6 +319,7 @@ private:
 public:\r
   CIfrOpHeader (IN UINT8 OpCode, IN VOID *StartAddr, IN UINT8 Length = 0);\r
   CIfrOpHeader (IN CIfrOpHeader &);\r
+  CIfrOpHeader& operator=(IN CONST CIfrOpHeader &);\r
 \r
   VOID IncLength (UINT8 Size) {\r
     if ((mHeader->Length + Size) > mHeader->Length) {\r
@@ -254,7 +329,7 @@ public:
 \r
   VOID DecLength (UINT8 Size) {\r
     if (mHeader->Length >= Size) {\r
-      mHeader -= Size;\r
+      mHeader->Length -= Size;\r
     }\r
   }\r
 \r
@@ -273,6 +348,10 @@ public:
   VOID UpdateHeader (IN EFI_IFR_OP_HEADER *Header) {\r
     mHeader = Header;\r
   }\r
+\r
+  UINT8 GetOpCode () {\r
+    return mHeader->OpCode;\r
+  }\r
 };\r
 \r
 extern UINT8 gScopeCount;\r
@@ -331,7 +410,7 @@ public:
   VOID VARSTORE_INFO (OUT EFI_VARSTORE_INFO *Info) {\r
     if (Info != NULL) {\r
       Info->mVarStoreId   = mHeader->VarStoreId;\r
-      memcpy (&Info->mVarStoreId, &mHeader->VarStoreInfo, sizeof (Info->mVarStoreId));\r
+      memmove (&Info->mVarStoreId, &mHeader->VarStoreInfo, sizeof (Info->mVarStoreId));\r
     }\r
   }\r
 \r
@@ -381,7 +460,11 @@ public:
     if (_FLAG_TEST_AND_CLEAR (Flags, EFI_IFR_FLAG_RESET_REQUIRED)) {\r
       mHeader->Flags |= EFI_IFR_FLAG_RESET_REQUIRED;\r
     }\r
-    \r
+\r
+    if (_FLAG_TEST_AND_CLEAR (Flags, EFI_IFR_FLAG_RECONNECT_REQUIRED)) {\r
+      mHeader->Flags |= EFI_IFR_FLAG_RECONNECT_REQUIRED;\r
+    }\r
+\r
     //\r
     //  Set LateCheck Flag to compatible for framework flag\r
     //  but it uses 0x20 as its flag, if in the future UEFI may take this flag\r
@@ -396,6 +479,10 @@ public:
 \r
     return _FLAGS_ZERO (Flags) ? VFR_RETURN_SUCCESS : VFR_RETURN_FLAGS_UNSUPPORTED;\r
   }\r
+\r
+  VOID UpdateCIfrQuestionHeader (IN EFI_IFR_QUESTION_HEADER *Header) {\r
+    mHeader = Header;\r
+  }\r
 };\r
 \r
 /*\r
@@ -546,10 +633,16 @@ public:
   BOOLEAN IsNumericOpcode () {\r
     return IsNumeric;\r
   }\r
+\r
+  VOID UpdateCIfrMinMaxStepData (IN MINMAXSTEP_DATA *MinMaxStepData) {\r
+    mMinMaxStepData = MinMaxStepData;\r
+  }\r
 };\r
 \r
 static CIfrQuestionHeader *gCurrentQuestion  = NULL;\r
 static CIfrMinMaxStepData *gCurrentMinMaxData = NULL;\r
+static BOOLEAN            gIsOrderedList = FALSE;\r
+static BOOLEAN            gIsStringOp = FALSE;\r
 \r
 /*\r
  * The definition of all of the UEFI IFR Objects\r
@@ -570,7 +663,7 @@ public:
   }\r
 \r
   VOID SetGuid (IN EFI_GUID *Guid) {\r
-    memcpy (&mFormSet->Guid, Guid, sizeof (EFI_GUID));\r
+    memmove (&mFormSet->Guid, Guid, sizeof (EFI_GUID));\r
   }\r
 \r
   VOID SetFormSetTitle (IN EFI_STRING_ID FormSetTitle) {\r
@@ -582,7 +675,7 @@ public:
   }\r
 \r
   VOID SetClassGuid (IN EFI_GUID *Guid) {\r
-    memcpy (&(mClassGuid[mFormSet->Flags++]), Guid, sizeof (EFI_GUID));\r
+    memmove (&(mClassGuid[mFormSet->Flags++]), Guid, sizeof (EFI_GUID));\r
   }\r
 \r
   UINT8 GetFlags() {\r
@@ -704,7 +797,7 @@ public:
       IncLength (sizeof (EFI_IFR_FORM_MAP_METHOD));\r
 \r
       mMethodMap->MethodTitle = MethodTitle;\r
-      memcpy (&(mMethodMap->MethodIdentifier), MethodGuid, sizeof (EFI_GUID));\r
+      memmove (&(mMethodMap->MethodIdentifier), MethodGuid, sizeof (EFI_GUID));\r
       mMethodMap ++;\r
     }\r
   }\r
@@ -724,7 +817,7 @@ public:
   }\r
 \r
   VOID SetGuid (IN EFI_GUID *Guid) {\r
-    memcpy (&mVarStore->Guid, Guid, sizeof (EFI_GUID));\r
+    memmove (&mVarStore->Guid, Guid, sizeof (EFI_GUID));\r
   }\r
 \r
   VOID SetVarStoreId (IN EFI_VARSTORE_ID VarStoreId) {\r
@@ -755,14 +848,16 @@ private:
   EFI_IFR_VARSTORE_EFI *mVarStoreEfi;\r
 \r
 public:\r
-  CIfrVarStoreEfi () : CIfrObj (EFI_IFR_VARSTORE_EFI_OP, (CHAR8 **)&mVarStoreEfi), \r
+  CIfrVarStoreEfi () : CIfrObj (EFI_IFR_VARSTORE_EFI_OP, (CHAR8 **)&mVarStoreEfi, sizeof (EFI_IFR_VARSTORE_EFI), TRUE),\r
                       CIfrOpHeader (EFI_IFR_VARSTORE_EFI_OP, &mVarStoreEfi->Header) {\r
     mVarStoreEfi->VarStoreId = EFI_VAROFFSET_INVALID;\r
+    mVarStoreEfi->Size       = 0;\r
     memset (&mVarStoreEfi->Guid, 0, sizeof (EFI_GUID));\r
+    mVarStoreEfi->Name[0]    = '\0';\r
   }\r
 \r
   VOID SetGuid (IN EFI_GUID *Guid) {\r
-    memcpy (&mVarStoreEfi->Guid, Guid, sizeof (EFI_GUID));\r
+    memmove (&mVarStoreEfi->Guid, Guid, sizeof (EFI_GUID));\r
   }\r
 \r
   VOID SetVarStoreId (IN UINT16 VarStoreId) {\r
@@ -772,6 +867,36 @@ public:
   VOID SetAttributes (IN UINT32 Attributes) {\r
     mVarStoreEfi->Attributes = Attributes;\r
   }\r
+  VOID SetSize (IN UINT16 Size) {\r
+    mVarStoreEfi->Size = Size;\r
+  }\r
+\r
+  VOID SetName (IN CHAR8 *Name) {\r
+    UINT8 Len;\r
+\r
+    if (Name != NULL) {\r
+      Len = (UINT8) strlen (Name);\r
+      if (Len != 0) {\r
+        if (ExpendObjBin (Len) == TRUE) {\r
+          IncLength (Len);\r
+          strcpy ((CHAR8 *)(mVarStoreEfi->Name), Name);\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
+  VOID SetBinaryLength (IN UINT16 Size) {\r
+    UINT16 Len;\r
+\r
+    Len = sizeof (EFI_IFR_VARSTORE_EFI);\r
+    if (Size > Len) {\r
+      ExpendObjBin(Size - Len);\r
+      IncLength(Size - Len);\r
+    } else {\r
+      ShrinkObjBin(Len - Size);\r
+      DecLength(Len - Size);\r
+    }\r
+  }\r
 };\r
 \r
 class CIfrVarStoreNameValue : public CIfrObj, public CIfrOpHeader {\r
@@ -786,7 +911,7 @@ public:
   }\r
 \r
   VOID SetGuid (IN EFI_GUID *Guid) {\r
-    memcpy (&mVarStoreNameValue->Guid, Guid, sizeof (EFI_GUID));\r
+    memmove (&mVarStoreNameValue->Guid, Guid, sizeof (EFI_GUID));\r
   }\r
 \r
   VOID SetVarStoreId (IN UINT16 VarStoreId) {\r
@@ -800,7 +925,7 @@ private:
 \r
 public:\r
   CIfrImage () : CIfrObj (EFI_IFR_IMAGE_OP, (CHAR8 **)&mImage),\r
-                 CIfrOpHeader (EFI_IFR_FORM_OP, &mImage->Header) {\r
+                 CIfrOpHeader (EFI_IFR_IMAGE_OP, &mImage->Header) {\r
     mImage->Id = EFI_IMAGE_ID_INVALID;\r
   }\r
 \r
@@ -809,6 +934,17 @@ public:
   }\r
 };\r
 \r
+class CIfrModal : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_MODAL_TAG *mModal;\r
+\r
+public:\r
+  CIfrModal () : CIfrObj (EFI_IFR_MODAL_TAG_OP, (CHAR8 **)&mModal),\r
+                 CIfrOpHeader (EFI_IFR_MODAL_TAG_OP, &mModal->Header) {\r
+  }\r
+};\r
+\r
+\r
 class CIfrLocked : public CIfrObj, public CIfrOpHeader {\r
 private:\r
   EFI_IFR_LOCKED *mLocked;\r
@@ -842,14 +978,15 @@ private:
 \r
 public:\r
   CIfrDefault (\r
+    IN UINT8              Size,\r
     IN UINT16             DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD,\r
     IN UINT8              Type      = EFI_IFR_TYPE_OTHER,\r
     IN EFI_IFR_TYPE_VALUE Value     = gZeroEfiIfrTypeValue\r
-    ) : CIfrObj (EFI_IFR_DEFAULT_OP, (CHAR8 **)&mDefault),\r
-        CIfrOpHeader (EFI_IFR_DEFAULT_OP, &mDefault->Header) {\r
+    ) : CIfrObj (EFI_IFR_DEFAULT_OP, (CHAR8 **)&mDefault, Size),\r
+        CIfrOpHeader (EFI_IFR_DEFAULT_OP, &mDefault->Header, Size) {\r
     mDefault->Type      = Type;\r
-    mDefault->Value     = Value;\r
     mDefault->DefaultId = DefaultId;\r
+    memmove (&(mDefault->Value), &Value, Size - OFFSET_OF (EFI_IFR_DEFAULT, Value));\r
   }\r
 \r
   VOID SetDefaultId (IN UINT16 DefaultId) {\r
@@ -861,7 +998,30 @@ public:
   }\r
 \r
   VOID SetValue (IN EFI_IFR_TYPE_VALUE Value) {\r
-    mDefault->Value = Value;\r
+    memmove (&mDefault->Value, &Value, mDefault->Header.Length - OFFSET_OF (EFI_IFR_DEFAULT, Value));\r
+  }\r
+};\r
+\r
+class CIfrDefault2 : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_DEFAULT_2 *mDefault;\r
+\r
+public:\r
+  CIfrDefault2 (\r
+    IN UINT16             DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD,\r
+    IN UINT8              Type      = EFI_IFR_TYPE_OTHER\r
+    ) : CIfrObj (EFI_IFR_DEFAULT_OP, (CHAR8 **)&mDefault, sizeof (EFI_IFR_DEFAULT_2)),\r
+        CIfrOpHeader (EFI_IFR_DEFAULT_OP, &mDefault->Header, sizeof (EFI_IFR_DEFAULT_2)) {\r
+    mDefault->Type      = Type;\r
+    mDefault->DefaultId = DefaultId;\r
+  }\r
+\r
+  VOID SetDefaultId (IN UINT16 DefaultId) {\r
+    mDefault->DefaultId = DefaultId;\r
+  }\r
+\r
+  VOID SetType (IN UINT8 Type) {\r
+    mDefault->Type = Type;\r
   }\r
 };\r
 \r
@@ -1003,12 +1163,8 @@ public:
     mRef2->FormId = FormId;\r
   }\r
 \r
-  EFI_VFR_RETURN_CODE SetQuestionId (IN EFI_QUESTION_ID QuestionId) {\r
-    if (QuestionId == EFI_QUESTION_ID_INVALID) {\r
-      return VFR_RETURN_UNDEFINED;\r
-    }\r
+  VOID SetQuestionId (IN EFI_QUESTION_ID QuestionId) {\r
     mRef2->QuestionId = QuestionId;\r
-    return VFR_RETURN_SUCCESS;\r
   }\r
 };\r
 \r
@@ -1043,8 +1199,8 @@ private:
   EFI_IFR_REF4 *mRef4;\r
 \r
 public:\r
-  CIfrRef4 () : CIfrObj (EFI_IFR_REF_OP, (CHAR8 **)&mRef4, sizeof(EFI_IFR_REF3)),\r
-               CIfrOpHeader (EFI_IFR_REF_OP, &mRef4->Header, sizeof (EFI_IFR_REF3)), \r
+  CIfrRef4 () : CIfrObj (EFI_IFR_REF_OP, (CHAR8 **)&mRef4, sizeof(EFI_IFR_REF4)),\r
+               CIfrOpHeader (EFI_IFR_REF_OP, &mRef4->Header, sizeof(EFI_IFR_REF4)), \r
                CIfrQuestionHeader (&mRef4->Question) {\r
     mRef4->FormId     = 0;\r
     mRef4->QuestionId = EFI_QUESTION_ID_INVALID;\r
@@ -1069,6 +1225,17 @@ public:
   }\r
 };\r
 \r
+class CIfrRef5 : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {\r
+private:\r
+  EFI_IFR_REF5 *mRef5;\r
+\r
+public:\r
+  CIfrRef5 () : CIfrObj (EFI_IFR_REF_OP, (CHAR8 **)&mRef5, sizeof (EFI_IFR_REF5)),\r
+              CIfrOpHeader (EFI_IFR_REF_OP, &mRef5->Header, sizeof (EFI_IFR_REF5)), \r
+              CIfrQuestionHeader (&mRef5->Question) {\r
+  }\r
+};\r
+\r
 class CIfrResetButton : public CIfrObj, public CIfrOpHeader, public CIfrStatementHeader {\r
 private:\r
   EFI_IFR_RESET_BUTTON *mResetButton;\r
@@ -1189,7 +1356,7 @@ private:
   EFI_IFR_NUMERIC *mNumeric;\r
 \r
 public:\r
-  CIfrNumeric () : CIfrObj (EFI_IFR_NUMERIC_OP, (CHAR8 **)&mNumeric),\r
+  CIfrNumeric () : CIfrObj (EFI_IFR_NUMERIC_OP, (CHAR8 **)&mNumeric, sizeof (EFI_IFR_NUMERIC), TRUE),\r
                    CIfrOpHeader (EFI_IFR_NUMERIC_OP, &mNumeric->Header),\r
                    CIfrQuestionHeader (&mNumeric->Question),\r
                    CIfrMinMaxStepData (&mNumeric->data, TRUE) {\r
@@ -1203,7 +1370,28 @@ public:
     gCurrentMinMaxData = NULL;\r
   }\r
 \r
-  EFI_VFR_RETURN_CODE SetFlags (IN UINT8 HFlags, IN UINT8 LFlags) {\r
+  VOID ShrinkBinSize (IN UINT16 Size) {\r
+    //\r
+    // Update the buffer size which is truly be used later.\r
+    //\r
+    ShrinkObjBin(Size);\r
+    DecLength(Size);\r
+\r
+    //\r
+    // Allocate buffer in gCFormPkg.\r
+    //\r
+    _EMIT_PENDING_OBJ();\r
+\r
+    //\r
+    // Update the buffer pointer used by other class.\r
+    //\r
+    mNumeric = (EFI_IFR_NUMERIC *) GetObjBinAddr();\r
+    UpdateHeader (&mNumeric->Header);\r
+    UpdateCIfrQuestionHeader(&mNumeric->Question);\r
+    UpdateCIfrMinMaxStepData(&mNumeric->data);\r
+  }\r
+\r
+  EFI_VFR_RETURN_CODE SetFlags (IN UINT8 HFlags, IN UINT8 LFlags, BOOLEAN DisplaySettingsSpecified = FALSE) {\r
     EFI_VFR_RETURN_CODE Ret;\r
 \r
     Ret = CIfrQuestionHeader::SetFlags (HFlags);\r
@@ -1211,13 +1399,17 @@ public:
       return Ret;\r
     }\r
 \r
-    if (LFlags & EFI_IFR_DISPLAY) {\r
-      mNumeric->Flags = LFlags;\r
-    } else {\r
+    if (DisplaySettingsSpecified == FALSE) {\r
       mNumeric->Flags = LFlags | EFI_IFR_DISPLAY_UINT_DEC;\r
+    } else {\r
+      mNumeric->Flags = LFlags;\r
     }\r
     return VFR_RETURN_SUCCESS;\r
   }\r
+\r
+  UINT8 GetNumericFlags () {\r
+    return mNumeric->Flags;\r
+  }\r
 };\r
 \r
 class CIfrOneOf : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader, public CIfrMinMaxStepData {\r
@@ -1225,7 +1417,7 @@ private:
   EFI_IFR_ONE_OF *mOneOf;\r
 \r
 public:\r
-  CIfrOneOf () : CIfrObj (EFI_IFR_ONE_OF_OP, (CHAR8 **)&mOneOf),\r
+  CIfrOneOf () : CIfrObj (EFI_IFR_ONE_OF_OP, (CHAR8 **)&mOneOf, sizeof (EFI_IFR_ONE_OF), TRUE),\r
                  CIfrOpHeader (EFI_IFR_ONE_OF_OP, &mOneOf->Header),\r
                  CIfrQuestionHeader (&mOneOf->Question),\r
                  CIfrMinMaxStepData (&mOneOf->data) {\r
@@ -1254,6 +1446,27 @@ public:
     }\r
     return VFR_RETURN_SUCCESS;\r
   }\r
+\r
+  VOID ShrinkBinSize (IN UINT16 Size) {\r
+    //\r
+    // Update the buffer size which is truly be used later.\r
+    //\r
+    ShrinkObjBin(Size);\r
+    DecLength(Size);\r
+\r
+    //\r
+    // Allocate buffer in gCFormPkg.\r
+    //\r
+    _EMIT_PENDING_OBJ();\r
+\r
+    //\r
+    // Update the buffer pointer used by other class.\r
+    //\r
+    mOneOf = (EFI_IFR_ONE_OF *) GetObjBinAddr();\r
+    UpdateHeader (&mOneOf->Header);\r
+    UpdateCIfrQuestionHeader(&mOneOf->Question);\r
+    UpdateCIfrMinMaxStepData(&mOneOf->data);\r
+  }\r
 };\r
 \r
 class CIfrString : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {\r
@@ -1451,6 +1664,26 @@ public:
   }\r
 };\r
 \r
+class CIfrWarningIf : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_WARNING_IF *mWarningIf;\r
+\r
+public:\r
+  CIfrWarningIf () : CIfrObj (EFI_IFR_WARNING_IF_OP, (CHAR8 **)&mWarningIf),\r
+                        CIfrOpHeader (EFI_IFR_WARNING_IF_OP, &mWarningIf->Header) {\r
+    mWarningIf->Warning = EFI_STRING_ID_INVALID;\r
+    mWarningIf->TimeOut = 0;\r
+  }\r
+\r
+  VOID SetWarning (IN EFI_STRING_ID Warning) {\r
+    mWarningIf->Warning = Warning;\r
+  }\r
+\r
+  VOID SetTimeOut (IN UINT8 TimeOut) {\r
+    mWarningIf->TimeOut = TimeOut;\r
+  }\r
+};\r
+\r
 class CIfrNoSubmitIf : public CIfrObj, public CIfrOpHeader {\r
 private:\r
   EFI_IFR_NO_SUBMIT_IF *mNoSubmitIf;\r
@@ -1481,6 +1714,21 @@ public:
   }\r
 };\r
 \r
+class CIfrRefreshId : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_REFRESH_ID *mRefreshId;\r
+\r
+public:\r
+  CIfrRefreshId () : CIfrObj (EFI_IFR_REFRESH_ID_OP, (CHAR8 **)&mRefreshId),\r
+      CIfrOpHeader (EFI_IFR_REFRESH_ID_OP, &mRefreshId->Header) {\r
+    memset (&mRefreshId->RefreshEventGroupId, 0, sizeof (EFI_GUID));\r
+  }\r
+\r
+  VOID SetRefreshEventGroutId (IN EFI_GUID *RefreshEventGroupId) {\r
+    memmove (&mRefreshId->RefreshEventGroupId, RefreshEventGroupId, sizeof (EFI_GUID));\r
+  }\r
+};\r
+\r
 class CIfrVarStoreDevice : public CIfrObj, public CIfrOpHeader {\r
 private:\r
   EFI_IFR_VARSTORE_DEVICE *mVarStoreDevice;\r
@@ -1501,12 +1749,12 @@ private:
   EFI_IFR_ONE_OF_OPTION *mOneOfOption;\r
 \r
 public:\r
-  CIfrOneOfOption () : CIfrObj (EFI_IFR_ONE_OF_OPTION_OP, (CHAR8 **)&mOneOfOption),\r
-                       CIfrOpHeader (EFI_IFR_ONE_OF_OPTION_OP, &mOneOfOption->Header) {\r
+  CIfrOneOfOption (UINT8 Size) : CIfrObj (EFI_IFR_ONE_OF_OPTION_OP, (CHAR8 **)&mOneOfOption, Size),\r
+                       CIfrOpHeader (EFI_IFR_ONE_OF_OPTION_OP, &mOneOfOption->Header, Size) {\r
     mOneOfOption->Flags  = 0;\r
     mOneOfOption->Option = EFI_STRING_ID_INVALID;\r
     mOneOfOption->Type   = EFI_IFR_TYPE_OTHER;\r
-    memset (&mOneOfOption->Value, 0, sizeof (mOneOfOption->Value));\r
+    memset (&mOneOfOption->Value, 0, Size - OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value));\r
   }\r
 \r
   VOID SetOption (IN EFI_STRING_ID Option) {\r
@@ -1514,6 +1762,7 @@ public:
   }\r
 \r
   EFI_VFR_RETURN_CODE SetFlags (IN UINT8 LFlags) {\r
+    mOneOfOption->Flags = 0;\r
     if (_FLAG_TEST_AND_CLEAR (LFlags, EFI_IFR_OPTION_DEFAULT)) {\r
       mOneOfOption->Flags |= EFI_IFR_OPTION_DEFAULT;\r
     }\r
@@ -1559,7 +1808,7 @@ public:
   }\r
 \r
   VOID SetValue (IN EFI_IFR_TYPE_VALUE Value) {\r
-    mOneOfOption->Value = Value;\r
+    memmove (&mOneOfOption->Value, &Value, mOneOfOption->Header.Length - OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value));\r
   }\r
 \r
   UINT8 GetFlags (VOID) {\r
@@ -1697,6 +1946,25 @@ public:
   }\r
 };\r
 \r
+class CIfrGuid : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_GUID *mGuid;\r
+\r
+public:\r
+  CIfrGuid (UINT8 Size) : CIfrObj (EFI_IFR_GUID_OP, (CHAR8 **)&mGuid, sizeof (EFI_IFR_GUID)+Size),\r
+                  CIfrOpHeader (EFI_IFR_GUID_OP, &mGuid->Header, sizeof (EFI_IFR_GUID)+Size) {\r
+    memset (&mGuid->Guid, 0, sizeof (EFI_GUID));\r
+  }\r
+\r
+  VOID SetGuid (IN EFI_GUID *Guid) {\r
+    memmove (&mGuid->Guid, Guid, sizeof (EFI_GUID));\r
+  }\r
+\r
+  VOID SetData (IN UINT8* DataBuff, IN UINT8 Size) {\r
+    memmove ((UINT8 *)mGuid + sizeof (EFI_IFR_GUID), DataBuff, Size);\r
+  }\r
+};\r
+\r
 class CIfrDup : public CIfrObj, public CIfrOpHeader {\r
 private:\r
   EFI_IFR_DUP *mDup;\r
@@ -1786,8 +2054,8 @@ private:
 public:\r
   CIfrEqIdList (\r
   IN UINT32 LineNo\r
-  ) : CIfrObj (EFI_IFR_EQ_ID_LIST_OP, (CHAR8 **)&mEqIdVList, sizeof (EFI_IFR_EQ_ID_VAL_LIST), TRUE),\r
-                   CIfrOpHeader (EFI_IFR_EQ_ID_LIST_OP, &mEqIdVList->Header) {\r
+  ) : CIfrObj (EFI_IFR_EQ_ID_VAL_LIST_OP, (CHAR8 **)&mEqIdVList, sizeof (EFI_IFR_EQ_ID_VAL_LIST), TRUE),\r
+                   CIfrOpHeader (EFI_IFR_EQ_ID_VAL_LIST_OP, &mEqIdVList->Header) {\r
     SetLineNo (LineNo);\r
     mEqIdVList->QuestionId   = EFI_QUESTION_ID_INVALID;\r
     mEqIdVList->ListLength   = 0;\r
@@ -1999,7 +2267,7 @@ public:
   }\r
 \r
   VOID SetPermissions (IN EFI_GUID *Permissions) {\r
-    memcpy (&mSecurity->Permissions, Permissions, sizeof (EFI_GUID));\r
+    memmove (&mSecurity->Permissions, Permissions, sizeof (EFI_GUID));\r
   }\r
 };\r
 \r
@@ -2439,6 +2707,21 @@ public:
   }\r
 };\r
 \r
+class CIfrMatch2 : public CIfrObj, public CIfrOpHeader {\r
+private:\r
+  EFI_IFR_MATCH2 *mMatch2;\r
+\r
+public:\r
+  CIfrMatch2 (\r
+  IN UINT32   LineNo,\r
+  IN EFI_GUID *Guid\r
+  ) : CIfrObj (EFI_IFR_MATCH2_OP, (CHAR8 **)&mMatch2),\r
+      CIfrOpHeader (EFI_IFR_MATCH2_OP, &mMatch2->Header) {\r
+    SetLineNo (LineNo);\r
+    memmove (&mMatch2->SyntaxType, Guid, sizeof (EFI_GUID));\r
+  }\r
+};\r
+\r
 class CIfrMultiply : public CIfrObj, public CIfrOpHeader {\r
 private:\r
   EFI_IFR_MULTIPLY *mMultiply;\r