]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/UPT/Object/Parser/InfBinaryObject.py
Sync BaseTools Branch (version r2271) to EDKII main trunk.
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Object / Parser / InfBinaryObject.py
diff --git a/BaseTools/Source/Python/UPT/Object/Parser/InfBinaryObject.py b/BaseTools/Source/Python/UPT/Object/Parser/InfBinaryObject.py
new file mode 100644 (file)
index 0000000..3685fed
--- /dev/null
@@ -0,0 +1,621 @@
+## @file\r
+# This file is used to define class objects of INF file [Binaries] section. \r
+# It will consumed by InfParser. \r
+#\r
+# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+#\r
+# This program and the accompanying materials are licensed and made available \r
+# under the terms and conditions of the BSD License which accompanies this \r
+# distribution. The full text of the license may be found at \r
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+'''\r
+InfBinaryObject\r
+'''\r
+\r
+import os\r
+\r
+from copy import deepcopy\r
+from Library import DataType as DT\r
+from Library import GlobalData\r
+import Logger.Log as Logger\r
+from Logger import ToolError\r
+from Logger import StringTable as ST\r
+from Library.Misc import Sdict\r
+\r
+from Object.Parser.InfCommonObject import InfSectionCommonDef\r
+from Object.Parser.InfCommonObject import CurrentLine\r
+from Library.Misc import ConvPathFromAbsToRel\r
+from Library.ExpressionValidate import IsValidFeatureFlagExp\r
+from Library.Misc import ValidFile\r
+from Library.ParserValidate import IsValidPath\r
+\r
+\r
+class InfBianryItem():\r
+    def __init__(self):\r
+        self.FileName = ''\r
+        self.Target = ''\r
+        self.FeatureFlagExp = ''\r
+        self.HelpString = ''\r
+        self.Type = ''\r
+        self.SupArchList = []\r
+\r
+    def SetFileName(self, FileName):\r
+        self.FileName = FileName\r
+    def GetFileName(self):\r
+        return self.FileName\r
+\r
+    def SetTarget(self, Target):\r
+        self.Target = Target\r
+    def GetTarget(self):\r
+        return self.Target\r
+\r
+    def SetFeatureFlagExp(self, FeatureFlagExp):\r
+        self.FeatureFlagExp = FeatureFlagExp\r
+    def GetFeatureFlagExp(self):\r
+        return self.FeatureFlagExp\r
+\r
+    def SetHelpString(self, HelpString):\r
+        self.HelpString = HelpString\r
+    def GetHelpString(self):\r
+        return self.HelpString\r
+\r
+    def SetType(self, Type):\r
+        self.Type = Type\r
+    def GetType(self):\r
+        return self.Type\r
+    def SetSupArchList(self, SupArchList):\r
+        self.SupArchList = SupArchList\r
+    def GetSupArchList(self):\r
+        return self.SupArchList\r
+\r
+class InfBianryVerItem(InfBianryItem, CurrentLine):\r
+    def __init__(self):\r
+        InfBianryItem.__init__(self)\r
+        CurrentLine.__init__(self)\r
+        self.VerTypeName = ''\r
+\r
+    def SetVerTypeName(self, VerTypeName):\r
+        self.VerTypeName = VerTypeName\r
+    def GetVerTypeName(self):\r
+        return self.VerTypeName\r
+\r
+class InfBianryUiItem(InfBianryItem, CurrentLine):\r
+    def __init__(self):\r
+        InfBianryItem.__init__(self)\r
+        CurrentLine.__init__(self)\r
+        self.UiTypeName = ''\r
+\r
+    def SetUiTypeName(self, UiTypeName):\r
+        self.UiTypeName = UiTypeName\r
+    def GetVerTypeName(self):\r
+        return self.UiTypeName\r
+\r
+class InfBianryCommonItem(InfBianryItem, CurrentLine):\r
+    def __init__(self):\r
+        self.CommonType = ''\r
+        self.TagName = ''\r
+        self.Family = ''\r
+        InfBianryItem.__init__(self)\r
+        CurrentLine.__init__(self)\r
+\r
+    def SetCommonType(self, CommonType):\r
+        self.CommonType = CommonType\r
+    def GetCommonType(self):\r
+        return self.CommonType\r
+\r
+    def SetTagName(self, TagName):\r
+        self.TagName = TagName\r
+    def GetTagName(self):\r
+        return self.TagName\r
+\r
+    def SetFamily(self, Family):\r
+        self.Family = Family\r
+    def GetFamily(self):\r
+        return self.Family\r
+\r
+##\r
+#\r
+#\r
+#\r
+class InfBinariesObject(InfSectionCommonDef):\r
+    def __init__(self):\r
+        self.Binaries = Sdict()\r
+        #\r
+        # Macro defined in this section should be only used in this section.\r
+        #\r
+        self.Macros = {}\r
+        InfSectionCommonDef.__init__(self)\r
+\r
+    ## CheckVer\r
+    #\r
+    #\r
+    def CheckVer(self, Ver, __SupArchList):\r
+        #\r
+        # Check Ver\r
+        #\r
+        for VerItem in Ver:\r
+            IsValidFileFlag = False\r
+            VerContent = VerItem[0]\r
+            VerComment = VerItem[1]\r
+            VerCurrentLine = VerItem[2]\r
+            GlobalData.gINF_CURRENT_LINE = VerCurrentLine\r
+            InfBianryVerItemObj = None\r
+            #\r
+            # Should not less than 2 elements\r
+            #\r
+            if len(VerContent) < 2:\r
+                Logger.Error("InfParser",\r
+                             ToolError.FORMAT_INVALID,\r
+                             ST.ERR_INF_PARSER_BINARY_ITEM_FORMAT_INVALID % (VerContent[0]),\r
+                             File=VerCurrentLine.GetFileName(),\r
+                             Line=VerCurrentLine.GetLineNo(),\r
+                             ExtraData=VerCurrentLine.GetLineString())\r
+                return False\r
+            if len(VerContent) > 4:\r
+                Logger.Error("InfParser",\r
+                             ToolError.FORMAT_INVALID,\r
+                             ST.ERR_INF_PARSER_BINARY_ITEM_FORMAT_INVALID_MAX % (VerContent[0], 4),\r
+                             File=VerCurrentLine.GetFileName(),\r
+                             Line=VerCurrentLine.GetLineNo(),\r
+                             ExtraData=VerCurrentLine.GetLineString())\r
+                return False\r
+            if len(VerContent) >= 2:\r
+                #\r
+                # Create a Ver Object.\r
+                #\r
+                InfBianryVerItemObj = InfBianryVerItem()\r
+\r
+                if VerContent[0] != DT.BINARY_FILE_TYPE_VER:\r
+                    Logger.Error("InfParser",\r
+                                 ToolError.FORMAT_INVALID,\r
+                                 ST.ERR_INF_PARSER_BINARY_VER_TYPE % DT.BINARY_FILE_TYPE_VER,\r
+                                 File=VerCurrentLine.GetFileName(),\r
+                                 Line=VerCurrentLine.GetLineNo(),\r
+                                 ExtraData=VerCurrentLine.GetLineString())\r
+\r
+                InfBianryVerItemObj.SetVerTypeName(VerContent[0])\r
+                InfBianryVerItemObj.SetType(VerContent[0])\r
+                #\r
+                # Verify File exist or not\r
+                #\r
+                FullFileName = os.path.normpath(os.path.realpath(os.path.join(GlobalData.gINF_MODULE_DIR,\r
+                                                                              VerContent[1])))\r
+                if not (ValidFile(FullFileName) or ValidFile(VerContent[1])):\r
+                    Logger.Error("InfParser",\r
+                                 ToolError.FORMAT_INVALID,\r
+                                 ST.ERR_INF_PARSER_BINARY_ITEM_FILE_NOT_EXIST % (VerContent[1]),\r
+                                 File=VerCurrentLine.GetFileName(),\r
+                                 Line=VerCurrentLine.GetLineNo(),\r
+                                 ExtraData=VerCurrentLine.GetLineString())\r
+                #\r
+                # Validate file exist/format.\r
+                #\r
+                if IsValidPath(VerContent[1], GlobalData.gINF_MODULE_DIR):\r
+                    IsValidFileFlag = True\r
+                else:\r
+                    Logger.Error("InfParser",\r
+                                 ToolError.FORMAT_INVALID,\r
+                                 ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID % (VerContent[1]),\r
+                                 File=VerCurrentLine.GetFileName(),\r
+                                 Line=VerCurrentLine.GetLineNo(),\r
+                                 ExtraData=VerCurrentLine.GetLineString())\r
+                    return False\r
+                if IsValidFileFlag:\r
+                    VerContent[0] = ConvPathFromAbsToRel(VerContent[0],\r
+                                            GlobalData.gINF_MODULE_DIR)\r
+                    InfBianryVerItemObj.SetFileName(VerContent[1])\r
+            if len(VerContent) >= 3:\r
+                #\r
+                # Add Target information\r
+                #\r
+                InfBianryVerItemObj.SetTarget(VerContent[2])\r
+            if len(VerContent) == 4:\r
+                if VerContent[3].strip() == '':\r
+                    Logger.Error("InfParser",\r
+                                 ToolError.FORMAT_INVALID,\r
+                                 ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_MISSING,\r
+                                 File=VerCurrentLine.GetFileName(),\r
+                                 Line=VerCurrentLine.GetLineNo(),\r
+                                 ExtraData=VerCurrentLine.GetLineString())\r
+                #\r
+                # Validate Feature Flag Express   \r
+                #\r
+                FeatureFlagRtv = IsValidFeatureFlagExp(VerContent[3].\\r
+                                                       strip())\r
+                if not FeatureFlagRtv[0]:\r
+                    Logger.Error("InfParser",\r
+                                 ToolError.FORMAT_INVALID,\r
+                                 ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID % (FeatureFlagRtv[1]),\r
+                                 File=VerCurrentLine.GetFileName(),\r
+                                 Line=VerCurrentLine.GetLineNo(),\r
+                                 ExtraData=VerCurrentLine.GetLineString())\r
+                InfBianryVerItemObj.SetFeatureFlagExp(VerContent[3])\r
+\r
+            InfBianryVerItemObj.SetSupArchList(__SupArchList)\r
+\r
+            #\r
+            # Determine binary file name duplicate. Follow below rule:\r
+            #\r
+            # A binary filename must not be duplicated within \r
+            # a [Binaries] section. A binary filename may appear in \r
+            # multiple architectural [Binaries] sections. A binary \r
+            # filename listed in an architectural [Binaries] section \r
+            # must not be listed in the common architectural \r
+            # [Binaries] section.\r
+            # \r
+            # NOTE: This check will not report error now.\r
+            # \r
+            for Item in self.Binaries:\r
+                if Item.GetFileName() == InfBianryVerItemObj.GetFileName():\r
+                    ItemSupArchList = Item.GetSupArchList()\r
+                    for ItemArch in ItemSupArchList:\r
+                        for VerItemObjArch in __SupArchList:\r
+                            if ItemArch == VerItemObjArch:\r
+                                #\r
+                                # ST.ERR_INF_PARSER_ITEM_DUPLICATE\r
+                                #\r
+                                pass\r
+                            if ItemArch.upper() == 'COMMON' or VerItemObjArch.upper() == 'COMMON':\r
+                                #\r
+                                # ERR_INF_PARSER_ITEM_DUPLICATE_COMMON\r
+                                #\r
+                                pass\r
+\r
+            if InfBianryVerItemObj != None:\r
+                if self.Binaries.has_key((InfBianryVerItemObj)):\r
+                    BinariesList = self.Binaries[InfBianryVerItemObj]\r
+                    BinariesList.append((InfBianryVerItemObj, VerComment))\r
+                    self.Binaries[InfBianryVerItemObj] = BinariesList\r
+                else:\r
+                    BinariesList = []\r
+                    BinariesList.append((InfBianryVerItemObj, VerComment))\r
+                    self.Binaries[InfBianryVerItemObj] = BinariesList\r
+\r
+    ## ParseCommonBinary\r
+    #\r
+    # ParseCommonBinary\r
+    #\r
+    def ParseCommonBinary(self, CommonBinary, __SupArchList):\r
+        #\r
+        # Check common binary definitions\r
+        # Type | FileName | Target | Family | TagName | FeatureFlagExp\r
+        #\r
+        for Item in CommonBinary:\r
+            IsValidFileFlag = False\r
+            ItemContent = Item[0]\r
+            ItemComment = Item[1]\r
+            CurrentLineOfItem = Item[2]\r
+            GlobalData.gINF_CURRENT_LINE = CurrentLineOfItem\r
+            InfBianryCommonItemObj = None\r
+            if len(ItemContent) < 2:\r
+                Logger.Error("InfParser",\r
+                             ToolError.FORMAT_INVALID,\r
+                             ST.ERR_INF_PARSER_BINARY_ITEM_FORMAT_INVALID % (ItemContent[0]),\r
+                             File=CurrentLineOfItem.GetFileName(),\r
+                             Line=CurrentLineOfItem.GetLineNo(),\r
+                             ExtraData=CurrentLineOfItem.GetLineString())\r
+                return False\r
+            if len(ItemContent) > 6:\r
+                Logger.Error("InfParser",\r
+                             ToolError.FORMAT_INVALID,\r
+                             ST.ERR_INF_PARSER_BINARY_ITEM_FORMAT_INVALID_MAX % (ItemContent[0], 6),\r
+                             File=CurrentLineOfItem.GetFileName(),\r
+                             Line=CurrentLineOfItem.GetLineNo(),\r
+                             ExtraData=CurrentLineOfItem.GetLineString())\r
+                return False\r
+            if len(ItemContent) >= 2:\r
+                #\r
+                # Create a Common Object.\r
+                #\r
+                InfBianryCommonItemObj = InfBianryCommonItem()\r
+                #\r
+                # Convert Binary type.\r
+                #\r
+                BinaryFileType = ItemContent[0].strip()\r
+                if BinaryFileType == 'RAW' or BinaryFileType == 'ACPI' or BinaryFileType == 'ASL':\r
+                    BinaryFileType = 'BIN'\r
+\r
+                if BinaryFileType not in DT.BINARY_FILE_TYPE_LIST:\r
+                    Logger.Error("InfParser",\r
+                                 ToolError.FORMAT_INVALID,\r
+                                 ST.ERR_INF_PARSER_BINARY_ITEM_INVALID_FILETYPE % \\r
+                                 (DT.BINARY_FILE_TYPE_LIST.__str__()),\r
+                                 File=CurrentLineOfItem.GetFileName(),\r
+                                 Line=CurrentLineOfItem.GetLineNo(),\r
+                                 ExtraData=CurrentLineOfItem.GetLineString())\r
+                    \r
+                if BinaryFileType == 'SUBTYPE_GUID':\r
+                    BinaryFileType = 'FREEFORM'\r
+                    \r
+                if BinaryFileType == 'LIB' or BinaryFileType == 'UEFI_APP':\r
+                    Logger.Error("InfParser",\r
+                                 ToolError.FORMAT_INVALID,\r
+                                 ST.ERR_INF_PARSER_BINARY_ITEM_INVALID_FILETYPE % \\r
+                                 (DT.BINARY_FILE_TYPE_LIST.__str__()),\r
+                                 File=CurrentLineOfItem.GetFileName(),\r
+                                 Line=CurrentLineOfItem.GetLineNo(),\r
+                                 ExtraData=CurrentLineOfItem.GetLineString())\r
+\r
+                InfBianryCommonItemObj.SetType(BinaryFileType)\r
+                InfBianryCommonItemObj.SetCommonType(ItemContent[0])\r
+                #\r
+                # Verify File exist or not\r
+                #\r
+                FullFileName = os.path.normpath(os.path.realpath(os.path.join(GlobalData.gINF_MODULE_DIR,\r
+                                                                              ItemContent[1])))\r
+                if not (ValidFile(FullFileName) or ValidFile(ItemContent[1])):\r
+                    Logger.Error("InfParser",\r
+                                 ToolError.FORMAT_INVALID,\r
+                                 ST.ERR_INF_PARSER_BINARY_ITEM_FILE_NOT_EXIST % (ItemContent[1]),\r
+                                 File=CurrentLineOfItem.GetFileName(),\r
+                                 Line=CurrentLineOfItem.GetLineNo(),\r
+                                 ExtraData=CurrentLineOfItem.GetLineString())\r
+                #\r
+                # Validate file exist/format.\r
+                #\r
+                if IsValidPath(ItemContent[1], GlobalData.gINF_MODULE_DIR):\r
+                    IsValidFileFlag = True\r
+                else:\r
+                    Logger.Error("InfParser",\r
+                                ToolError.FORMAT_INVALID,\r
+                                ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID % (ItemContent[1]),\r
+                                File=CurrentLineOfItem.GetFileName(),\r
+                                Line=CurrentLineOfItem.GetLineNo(),\r
+                                ExtraData=CurrentLineOfItem.GetLineString())\r
+                    return False\r
+                if IsValidFileFlag:\r
+                    ItemContent[0] = ConvPathFromAbsToRel(ItemContent[0], GlobalData.gINF_MODULE_DIR)\r
+                    InfBianryCommonItemObj.SetFileName(ItemContent[1])\r
+            if len(ItemContent) >= 3:\r
+                #\r
+                # Add Target information\r
+                #\r
+                InfBianryCommonItemObj.SetTarget(ItemContent[2])\r
+            if len(ItemContent) >= 4:\r
+                #\r
+                # Add Family information\r
+                #\r
+                InfBianryCommonItemObj.SetFamily(ItemContent[3])\r
+            if len(ItemContent) >= 5:\r
+                #\r
+                # TagName entries are build system specific. If there \r
+                # is content in the entry, the tool must exit \r
+                # gracefully with an error message that indicates build\r
+                # system specific content cannot be distributed using \r
+                # the UDP\r
+                #\r
+                if ItemContent[4].strip() != '':\r
+                    Logger.Error("InfParser",\r
+                                 ToolError.FORMAT_INVALID,\r
+                                 ST.ERR_INF_PARSER_TAGNAME_NOT_PERMITTED % (ItemContent[4]),\r
+                                 File=CurrentLineOfItem.GetFileName(),\r
+                                 Line=CurrentLineOfItem.GetLineNo(),\r
+                                 ExtraData=CurrentLineOfItem.GetLineString())\r
+            if len(ItemContent) == 6:\r
+                #\r
+                # Add FeatureFlagExp\r
+                #\r
+                if ItemContent[5].strip() == '':\r
+                    Logger.Error("InfParser",\r
+                                 ToolError.FORMAT_INVALID,\r
+                                 ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_MISSING,\r
+                                 File=CurrentLineOfItem.GetFileName(),\r
+                                 Line=CurrentLineOfItem.GetLineNo(),\r
+                                 ExtraData=CurrentLineOfItem.GetLineString())\r
+                #\r
+                # Validate Feature Flag Express   \r
+                #\r
+                FeatureFlagRtv = IsValidFeatureFlagExp(ItemContent[5].strip())\r
+                if not FeatureFlagRtv[0]:\r
+                    Logger.Error("InfParser",\r
+                                 ToolError.FORMAT_INVALID,\r
+                                 ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID % (FeatureFlagRtv[1]),\r
+                                 File=CurrentLineOfItem.GetFileName(),\r
+                                 Line=CurrentLineOfItem.GetLineNo(),\r
+                                 ExtraData=CurrentLineOfItem.GetLineString())\r
+                InfBianryCommonItemObj.SetFeatureFlagExp(ItemContent[5])\r
+\r
+            InfBianryCommonItemObj.SetSupArchList(__SupArchList)\r
+\r
+            #\r
+            # Determine binary file name duplicate. Follow below rule:\r
+            #\r
+            # A binary filename must not be duplicated within \r
+            # a [Binaries] section. A binary filename may appear in \r
+            # multiple architectural [Binaries] sections. A binary \r
+            # filename listed in an architectural [Binaries] section \r
+            # must not be listed in the common architectural \r
+            # [Binaries] section.\r
+            # \r
+            # NOTE: This check will not report error now.\r
+            # \r
+#            for Item in self.Binaries:\r
+#                if Item.GetFileName() == InfBianryCommonItemObj.GetFileName():\r
+#                    ItemSupArchList = Item.GetSupArchList()\r
+#                    for ItemArch in ItemSupArchList:\r
+#                        for ComItemObjArch in __SupArchList:\r
+#                            if ItemArch == ComItemObjArch:\r
+#                                #\r
+#                                # ST.ERR_INF_PARSER_ITEM_DUPLICATE\r
+#                                #\r
+#                                pass\r
+#\r
+#                            if ItemArch.upper() == 'COMMON' or ComItemObjArch.upper() == 'COMMON':\r
+#                                #\r
+#                                # ERR_INF_PARSER_ITEM_DUPLICATE_COMMON\r
+#                                #\r
+#                                pass\r
+\r
+            if InfBianryCommonItemObj != None:\r
+                if self.Binaries.has_key((InfBianryCommonItemObj)):\r
+                    BinariesList = self.Binaries[InfBianryCommonItemObj]\r
+                    BinariesList.append((InfBianryCommonItemObj, ItemComment))\r
+                    self.Binaries[InfBianryCommonItemObj] = BinariesList\r
+                else:\r
+                    BinariesList = []\r
+                    BinariesList.append((InfBianryCommonItemObj, ItemComment))\r
+                    self.Binaries[InfBianryCommonItemObj] = BinariesList\r
+\r
+    def SetBinary(self, UiInf=None, Ver=None, CommonBinary=None, ArchList=None):\r
+\r
+        __SupArchList = []\r
+        for ArchItem in ArchList:\r
+            #\r
+            # Validate Arch\r
+            #            \r
+            if (ArchItem == '' or ArchItem == None):\r
+                ArchItem = 'COMMON'\r
+            __SupArchList.append(ArchItem)\r
+\r
+        if UiInf != None:\r
+            if len(UiInf) > 0:\r
+                #\r
+                # Check UI\r
+                #                    \r
+                for UiItem in UiInf:\r
+                    IsValidFileFlag = False\r
+                    InfBianryUiItemObj = None\r
+                    UiContent = UiItem[0]\r
+                    UiComment = UiItem[1]\r
+                    UiCurrentLine = UiItem[2]\r
+                    GlobalData.gINF_CURRENT_LINE = deepcopy(UiItem[2])\r
+                    #\r
+                    # Should not less than 2 elements\r
+                    #\r
+                    if len(UiContent) < 2:\r
+                        Logger.Error("InfParser",\r
+                                     ToolError.FORMAT_INVALID,\r
+                                     ST.ERR_INF_PARSER_BINARY_ITEM_FORMAT_INVALID % (UiContent[0]),\r
+                                     File=UiCurrentLine.GetFileName(),\r
+                                     Line=UiCurrentLine.GetLineNo(),\r
+                                     ExtraData=UiCurrentLine.GetLineString())\r
+                        return False\r
+\r
+                    if len(UiContent) > 4:\r
+                        Logger.Error("InfParser",\r
+                                     ToolError.FORMAT_INVALID,\r
+                                     ST.ERR_INF_PARSER_BINARY_ITEM_FORMAT_INVALID_MAX % (UiContent[0], 4),\r
+                                     File=UiCurrentLine.GetFileName(),\r
+                                     Line=UiCurrentLine.GetLineNo(),\r
+                                     ExtraData=UiCurrentLine.GetLineString())\r
+                        return False\r
+                    if len(UiContent) >= 2:\r
+                        #\r
+                        # Create an Ui Object.\r
+                        #\r
+                        InfBianryUiItemObj = InfBianryUiItem()\r
+                        if UiContent[0] != 'UI':\r
+                            Logger.Error("InfParser",\r
+                                         ToolError.FORMAT_INVALID,\r
+                                         ST.ERR_INF_PARSER_BINARY_VER_TYPE % ('UI'),\r
+                                         File=UiCurrentLine.GetFileName(),\r
+                                         Line=UiCurrentLine.GetLineNo(),\r
+                                         ExtraData=UiCurrentLine.GetLineString())\r
+                        InfBianryUiItemObj.SetUiTypeName(UiContent[0])\r
+                        InfBianryUiItemObj.SetType(UiContent[0])\r
+                        #\r
+                        # Verify File exist or not\r
+                        #\r
+                        FullFileName = os.path.normpath(os.path.realpath(os.path.join(GlobalData.gINF_MODULE_DIR,\r
+                                                                                      UiContent[1])))\r
+                        if not (ValidFile(FullFileName) or ValidFile(UiContent[1])):\r
+                            Logger.Error("InfParser",\r
+                                         ToolError.FORMAT_INVALID,\r
+                                         ST.ERR_INF_PARSER_BINARY_ITEM_FILE_NOT_EXIST % (UiContent[1]),\r
+                                         File=UiCurrentLine.GetFileName(),\r
+                                         Line=UiCurrentLine.GetLineNo(),\r
+                                         ExtraData=UiCurrentLine.GetLineString())\r
+                        #\r
+                        # Validate file exist/format.\r
+                        #\r
+                        if IsValidPath(UiContent[1], GlobalData.gINF_MODULE_DIR):\r
+                            IsValidFileFlag = True\r
+                        else:\r
+                            Logger.Error("InfParser",\r
+                                         ToolError.FORMAT_INVALID,\r
+                                         ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID % (UiContent[1]),\r
+                                         File=UiCurrentLine.GetFileName(),\r
+                                         Line=UiCurrentLine.GetLineNo(),\r
+                                         ExtraData=UiCurrentLine.GetLineString())\r
+                            return False\r
+                        if IsValidFileFlag:\r
+                            UiContent[0] = ConvPathFromAbsToRel(UiContent[0], GlobalData.gINF_MODULE_DIR)\r
+                            InfBianryUiItemObj.SetFileName(UiContent[1])\r
+                    if len(UiContent) >= 3:\r
+                        #\r
+                        # Add Target information\r
+                        #\r
+                        InfBianryUiItemObj.SetTarget(UiContent[2])\r
+                    if len(UiContent) == 4:\r
+                        if UiContent[3].strip() == '':\r
+                            Logger.Error("InfParser",\r
+                                         ToolError.FORMAT_INVALID,\r
+                                         ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_MISSING,\r
+                                         File=UiCurrentLine.GetFileName(),\r
+                                         Line=UiCurrentLine.GetLineNo(),\r
+                                         ExtraData=UiCurrentLine.GetLineString())\r
+                        #\r
+                        # Validate Feature Flag Express   \r
+                        #\r
+                        FeatureFlagRtv = IsValidFeatureFlagExp(UiContent[3].strip())\r
+                        if not FeatureFlagRtv[0]:\r
+                            Logger.Error("InfParser",\r
+                                         ToolError.FORMAT_INVALID,\r
+                                         ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID % (FeatureFlagRtv[1]),\r
+                                         File=UiCurrentLine.GetFileName(),\r
+                                         Line=UiCurrentLine.GetLineNo(),\r
+                                         ExtraData=UiCurrentLine.GetLineString())\r
+                        InfBianryUiItemObj.SetFeatureFlagExp(UiContent[3])\r
+\r
+                    InfBianryUiItemObj.SetSupArchList(__SupArchList)\r
+\r
+                    #\r
+                    # Determine binary file name duplicate. Follow below rule:\r
+                    #\r
+                    # A binary filename must not be duplicated within \r
+                    # a [Binaries] section. A binary filename may appear in \r
+                    # multiple architectural [Binaries] sections. A binary \r
+                    # filename listed in an architectural [Binaries] section \r
+                    # must not be listed in the common architectural \r
+                    # [Binaries] section.\r
+                    # \r
+                    # NOTE: This check will not report error now.\r
+                    # \r
+#                    for Item in self.Binaries:\r
+#                        if Item.GetFileName() == InfBianryUiItemObj.GetFileName():\r
+#                            ItemSupArchList = Item.GetSupArchList()\r
+#                            for ItemArch in ItemSupArchList:\r
+#                                for UiItemObjArch in __SupArchList:\r
+#                                    if ItemArch == UiItemObjArch:\r
+#                                        #\r
+#                                        # ST.ERR_INF_PARSER_ITEM_DUPLICATE\r
+#                                        #\r
+#                                        pass\r
+#                                    if ItemArch.upper() == 'COMMON' or UiItemObjArch.upper() == 'COMMON':\r
+#                                        #\r
+#                                        # ERR_INF_PARSER_ITEM_DUPLICATE_COMMON\r
+#                                        #\r
+#                                        pass\r
+\r
+                    if InfBianryUiItemObj != None:\r
+                        if self.Binaries.has_key((InfBianryUiItemObj)):\r
+                            BinariesList = self.Binaries[InfBianryUiItemObj]\r
+                            BinariesList.append((InfBianryUiItemObj, UiComment))\r
+                            self.Binaries[InfBianryUiItemObj] = BinariesList\r
+                        else:\r
+                            BinariesList = []\r
+                            BinariesList.append((InfBianryUiItemObj, UiComment))\r
+                            self.Binaries[InfBianryUiItemObj] = BinariesList\r
+        if Ver != None and len(Ver) > 0:\r
+            self.CheckVer(Ver, __SupArchList)\r
+        if CommonBinary and len(CommonBinary) > 0:\r
+            self.ParseCommonBinary(CommonBinary, __SupArchList)\r
+\r
+        return True\r
+\r
+    def GetBinary(self):\r
+        return self.Binaries\r