]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/VfrCompile/VfrFormPkg.h
BaseTools: Fix clang C++ build error
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrFormPkg.h
index f908718c029bfbf2d7f72b4d717cfb880a67fe76..3d2def8b957686eb3647ff5b2b88f805ab8535d5 100644 (file)
@@ -2,7 +2,7 @@
   \r
   The definition of CFormPkg's member function\r
 \r
-Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2014, 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
@@ -115,12 +115,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
@@ -145,12 +149,22 @@ 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
+    );\r
+  CHAR8 *             GetBufAddrBaseOnOffset (\r
+    IN UINT32             Offset\r
     );\r
 };\r
 \r
 extern CFormPkg       gCFormPkg;\r
 extern CVfrStringDB   gCVfrStringDB;\r
+extern UINT32         gAdjustOpcodeOffset;\r
+extern BOOLEAN        gNeedAdjustOpcode;\r
 \r
 struct SIfrRecord {\r
   UINT32     mLineNo;\r
@@ -189,6 +203,10 @@ public:
     mSwitch = FALSE;\r
   }\r
 \r
+  SIfrRecord * GetRecordInfoFromOffset (IN UINT32);\r
+  VOID        IfrAdjustOffsetForRecord (VOID);\r
+  BOOLEAN     IfrAdjustDynamicOpcodeInRecords (VOID);\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
@@ -227,6 +245,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
@@ -346,7 +368,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
@@ -411,6 +433,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
@@ -561,6 +587,10 @@ 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
@@ -585,7 +615,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
@@ -597,7 +627,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
@@ -719,7 +749,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
@@ -739,7 +769,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
@@ -779,7 +809,7 @@ public:
   }\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
@@ -833,7 +863,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
@@ -847,7 +877,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
@@ -858,7 +888,7 @@ public:
 \r
 class CIfrModal : public CIfrObj, public CIfrOpHeader {\r
 private:\r
-  EFI_IFR_MODAL *mModal;\r
+  EFI_IFR_MODAL_TAG *mModal;\r
 \r
 public:\r
   CIfrModal () : CIfrObj (EFI_IFR_MODAL_TAG_OP, (CHAR8 **)&mModal),\r
@@ -900,14 +930,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
@@ -919,7 +950,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
@@ -1061,12 +1115,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
@@ -1258,7 +1308,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
@@ -1272,7 +1322,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
@@ -1280,10 +1351,10 @@ 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
@@ -1294,7 +1365,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
@@ -1323,6 +1394,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
@@ -1520,6 +1612,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
@@ -1561,7 +1673,7 @@ public:
   }\r
 \r
   VOID SetRefreshEventGroutId (IN EFI_GUID *RefreshEventGroupId) {\r
-    memcpy (&mRefreshId->RefreshEventGroupId, RefreshEventGroupId, sizeof (EFI_GUID));\r
+    memmove (&mRefreshId->RefreshEventGroupId, RefreshEventGroupId, sizeof (EFI_GUID));\r
   }\r
 };\r
 \r
@@ -1585,12 +1697,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
@@ -1643,7 +1755,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
@@ -1792,11 +1904,11 @@ public:
   }\r
 \r
   VOID SetGuid (IN EFI_GUID *Guid) {\r
-    memcpy (&mGuid->Guid, Guid, sizeof (EFI_GUID));\r
+    memmove (&mGuid->Guid, Guid, sizeof (EFI_GUID));\r
   }\r
 \r
   VOID SetData (IN UINT8* DataBuff, IN UINT8 Size) {\r
-    memcpy ((UINT8 *)mGuid + sizeof (EFI_IFR_GUID), DataBuff, Size);\r
+    memmove ((UINT8 *)mGuid + sizeof (EFI_IFR_GUID), DataBuff, Size);\r
   }\r
 };\r
 \r
@@ -1889,8 +2001,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
@@ -2102,7 +2214,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