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