--- /dev/null
+## @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