## @file # This file is used to parse a PCD file of .PKG file # # Copyright (c) 2011, Intel Corporation. All rights reserved.
# # 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. # ''' PcdXml ''' ## # Import Modules # from Library.Xml.XmlRoutines import XmlElement from Library.Xml.XmlRoutines import XmlAttribute from Library.Xml.XmlRoutines import XmlNode from Library.Xml.XmlRoutines import CreateXmlElement from Library.Xml.XmlRoutines import XmlList from Library.String import GetStringOfList from Library.String import ConvertNEToNOTEQ from Library.String import ConvertNOTEQToNE from Library import GlobalData from Object.POM.CommonObject import PcdObject from Object.POM.CommonObject import PcdErrorObject from Xml.CommonXml import HelpTextXml from Xml.CommonXml import CommonDefinesXml from Xml.XmlParserMisc import GetHelpTextList ## # PcdErrorXml # class PcdErrorXml(object): def __init__(self): self.ValidValueList = '' self.ValidValueListLang = '' self.ValidValueRange = '' self.Expression = '' self.ErrorNumber = '' self.ErrorMessage = [] def FromXml(self, Item, Key): self.ValidValueList = XmlElement(Item, '%s/ValidValueList' % Key) self.ValidValueListLang = \ XmlAttribute(XmlNode(Item, '%s/ValidValueList' % Key), 'Lang') self.ValidValueRange = XmlElement(Item, '%s/ValidValueRange' % Key) self.Expression = XmlElement(Item, '%s/Expression' % Key) self.ErrorNumber = XmlElement(Item, '%s/ErrorNumber' % Key) for ErrMsg in XmlList(Item, '%s/ErrorMessage' % Key): ErrorMessageString = XmlElement(ErrMsg, 'ErrorMessage') ErrorMessageLang = \ XmlAttribute(XmlNode(ErrMsg, 'ErrorMessage'), 'Lang') self.ErrorMessage.append((ErrorMessageLang, ErrorMessageString)) Error = PcdErrorObject() Error.SetValidValue(self.ValidValueList) Error.SetValidValueLang(self.ValidValueListLang) Error.SetValidValueRange(self.ValidValueRange) Error.SetExpression(self.Expression) Error.SetErrorNumber(self.ErrorNumber) Error.SetErrorMessageList(self.ErrorMessage) return Error def ToXml(self, PcdError, Key): if self.Expression: pass AttributeList = [] NodeList = [] if PcdError.GetValidValue(): Element1 = \ CreateXmlElement('ValidValueList', PcdError.GetValidValue(), [], \ [['Lang', PcdError.GetValidValueLang()]]) NodeList.append(Element1) if PcdError.GetValidValueRange(): Element1 = \ CreateXmlElement('ValidValueRange', \ PcdError.GetValidValueRange(), [], []) NodeList.append(Element1) if PcdError.GetExpression(): NodeList.append(['Expression', PcdError.GetExpression()]) if PcdError.GetErrorNumber(): NodeList.append(['ErrorNumber', PcdError.GetErrorNumber()]) for Item in PcdError.GetErrorMessageList(): Element = \ CreateXmlElement('ErrorMessage', Item[1], [], [['Lang', Item[0]]]) NodeList.append(Element) Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList) return Root def __str__(self): return "ValidValueList = %s ValidValueListLang = %s ValidValueRange \ = %s Expression = %s ErrorNumber = %s %s" % \ (self.ValidValueList, self.ValidValueListLang, self.ValidValueRange, \ self.Expression, self.ErrorNumber, self.ErrorMessage) ## # PcdEntryXml # class PcdEntryXml(object): def __init__(self): self.PcdItemType = '' self.PcdUsage = '' self.TokenSpaceGuidCName = '' self.TokenSpaceGuidValue = '' self.Token = '' self.CName = '' self.PcdCName = '' self.DatumType = '' self.ValidUsage = '' self.DefaultValue = '' self.MaxDatumSize = '' self.Value = '' self.Offset = '' self.CommonDefines = CommonDefinesXml() self.HelpText = [] self.PcdError = [] ## # AsBuilt will use FromXml # def FromXml(self, Item, Key): self.PcdItemType = \ XmlAttribute(XmlNode(Item, '%s' % Key), 'PcdItemType') self.PcdUsage = XmlAttribute(XmlNode(Item, '%s' % Key), 'PcdUsage') self.TokenSpaceGuidCName = \ XmlElement(Item, '%s/TokenSpaceGuidCname' % Key) self.TokenSpaceGuidValue = \ XmlElement(Item, '%s/TokenSpaceGuidValue' % Key) self.Token = XmlElement(Item, '%s/Token' % Key) self.CName = XmlElement(Item, '%s/CName' % Key) self.PcdCName = XmlElement(Item, '%s/PcdCName' % Key) self.DatumType = XmlElement(Item, '%s/DatumType' % Key) self.ValidUsage = XmlElement(Item, '%s/ValidUsage' % Key) if not GlobalData.gIS_BINARY_INF: self.DefaultValue = XmlElement(Item, '%s/DefaultValue' % Key) else: self.DefaultValue = XmlElement(Item, '%s/Value' % Key) self.MaxDatumSize = XmlElement(Item, '%s/MaxDatumSize' % Key) self.Value = XmlElement(Item, '%s/Value' % Key) self.Offset = XmlElement(Item, '%s/Offset' % Key) self.CommonDefines.FromXml(XmlNode(Item, '%s' % Key), Key) for HelpTextItem in XmlList(Item, '%s/HelpText' % Key): HelpTextObj = HelpTextXml() HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key) self.HelpText.append(HelpTextObj) for PcdErrorItem in XmlList(Item, '%s/PcdError' % Key): PcdErrorObjXml = PcdErrorXml() PcdErrorObj = PcdErrorObjXml.FromXml(PcdErrorItem, 'PcdError') self.PcdError.append(PcdErrorObj) self.DefaultValue = ConvertNOTEQToNE(self.DefaultValue) PcdEntry = PcdObject() PcdEntry.SetSupArchList(self.CommonDefines.SupArchList) PcdEntry.SetTokenSpaceGuidCName(self.TokenSpaceGuidCName) PcdEntry.SetTokenSpaceGuidValue(self.TokenSpaceGuidValue) PcdEntry.SetToken(self.Token) PcdEntry.SetOffset(self.Offset) PcdEntry.SetCName(self.CName) PcdEntry.SetPcdCName(self.PcdCName) PcdEntry.SetDatumType(self.DatumType) PcdEntry.SetValidUsage(self.ValidUsage) PcdEntry.SetDefaultValue(self.DefaultValue) PcdEntry.SetMaxDatumSize(self.MaxDatumSize) PcdEntry.SetFeatureFlag(ConvertNOTEQToNE(self.CommonDefines.FeatureFlag)) PcdEntry.SetItemType(self.PcdItemType) PcdEntry.SetHelpTextList(GetHelpTextList(self.HelpText)) PcdEntry.SetPcdErrorsList(self.PcdError) return PcdEntry ## # Package will use FromXml2 # def FromXml2(self, Item, Key): self.TokenSpaceGuidCName = \ XmlElement(Item, '%s/TokenSpaceGuidCname' % Key) self.Token = XmlElement(Item, '%s/Token' % Key) self.CName = XmlElement(Item, '%s/CName' % Key) self.DatumType = XmlElement(Item, '%s/DatumType' % Key) self.ValidUsage = XmlElement(Item, '%s/ValidUsage' % Key) self.DefaultValue = XmlElement(Item, '%s/DefaultValue' % Key) self.MaxDatumSize = XmlElement(Item, '%s/MaxDatumSize' % Key) self.CommonDefines.FromXml(XmlNode(Item, '%s' % Key), Key) for HelpTextItem in XmlList(Item, '%s/HelpText' % Key): HelpTextObj = HelpTextXml() HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key) self.HelpText.append(HelpTextObj) for PcdErrorItem in XmlList(Item, '%s/PcdError' % Key): PcdErrorObjXml = PcdErrorXml() PcdErrorObj = PcdErrorObjXml.FromXml(PcdErrorItem, 'PcdError') self.PcdError.append(PcdErrorObj) self.DefaultValue = ConvertNOTEQToNE(self.DefaultValue) PcdEntry = PcdObject() PcdEntry.SetSupArchList(self.CommonDefines.SupArchList) PcdEntry.SetSupModuleList(self.CommonDefines.SupModList) PcdEntry.SetTokenSpaceGuidCName(self.TokenSpaceGuidCName) PcdEntry.SetToken(self.Token) PcdEntry.SetCName(self.CName) PcdEntry.SetDatumType(self.DatumType) PcdEntry.SetValidUsage(self.ValidUsage) PcdEntry.SetDefaultValue(self.DefaultValue) PcdEntry.SetMaxDatumSize(self.MaxDatumSize) PcdEntry.SetFeatureFlag(ConvertNOTEQToNE(self.CommonDefines.FeatureFlag)) PcdEntry.SetHelpTextList(GetHelpTextList(self.HelpText)) PcdEntry.SetPcdErrorsList(self.PcdError) return PcdEntry ## # Module will use FromXml3 # def FromXml3(self, Item, Key): self.PcdItemType = \ XmlAttribute(XmlNode(Item, '%s' % Key), 'PcdItemType') self.PcdUsage = XmlAttribute(XmlNode(Item, '%s' % Key), 'PcdUsage') self.TokenSpaceGuidCName = \ XmlElement(Item, '%s/TokenSpaceGuidCName' % Key) self.CName = XmlElement(Item, '%s/CName' % Key) self.DefaultValue = XmlElement(Item, '%s/DefaultValue' % Key) self.CommonDefines.FromXml(XmlNode(Item, '%s' % Key), Key) for HelpTextItem in XmlList(Item, '%s/HelpText' % Key): HelpTextObj = HelpTextXml() HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key) self.HelpText.append(HelpTextObj) for PcdErrorItem in XmlList(Item, '%s/PcdError' % Key): PcdErrorObj = PcdErrorXml() PcdErrorObj.FromXml(PcdErrorItem, 'PcdError') self.PcdError.append(PcdErrorObj) self.DefaultValue = ConvertNOTEQToNE(self.DefaultValue) PcdEntry = PcdObject() PcdEntry.SetSupArchList(self.CommonDefines.SupArchList) PcdEntry.SetTokenSpaceGuidCName(self.TokenSpaceGuidCName) PcdEntry.SetCName(self.CName) PcdEntry.SetValidUsage(self.PcdUsage) PcdEntry.SetDefaultValue(self.DefaultValue) PcdEntry.SetFeatureFlag(ConvertNOTEQToNE(self.CommonDefines.FeatureFlag)) PcdEntry.SetItemType(self.PcdItemType) PcdEntry.SetHelpTextList(GetHelpTextList(self.HelpText)) PcdEntry.SetPcdErrorsList(self.PcdError) return PcdEntry def ToXml(self, PcdEntry, Key): if self.PcdCName: pass DefaultValue = ConvertNEToNOTEQ(PcdEntry.GetDefaultValue()) AttributeList = \ [['SupArchList', GetStringOfList(PcdEntry.GetSupArchList())], \ ['PcdUsage', PcdEntry.GetValidUsage()], \ ['PcdItemType', PcdEntry.GetItemType()], \ ['FeatureFlag', PcdEntry.GetFeatureFlag()], ] NodeList = [['TokenSpaceGuidCname', PcdEntry.GetTokenSpaceGuidCName()], ['TokenSpaceGuidValue', PcdEntry.GetTokenSpaceGuidValue()], ['Token', PcdEntry.GetToken()], ['CName', PcdEntry.GetCName()], ['DatumType', PcdEntry.GetDatumType()], ['ValidUsage', GetStringOfList(PcdEntry.GetValidUsage())], ['DefaultValue', DefaultValue], ['MaxDatumSize', PcdEntry.GetMaxDatumSize()], ['Offset', PcdEntry.GetOffset()], ] for Item in PcdEntry.GetHelpTextList(): Tmp = HelpTextXml() NodeList.append(Tmp.ToXml(Item)) for Item in PcdEntry.GetPcdErrorsList(): Tmp = PcdErrorXml() NodeList.append(Tmp.ToXml(Item, 'PcdError')) Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList) return Root ## # Package will use ToXml2 # def ToXml2(self, PcdEntry, Key): if self.PcdCName: pass DefaultValue = ConvertNEToNOTEQ(PcdEntry.GetDefaultValue()) AttributeList = \ [['SupArchList', GetStringOfList(PcdEntry.GetSupArchList())], \ ['SupModList', GetStringOfList(PcdEntry.GetSupModuleList())] ] NodeList = [['TokenSpaceGuidCname', PcdEntry.GetTokenSpaceGuidCName()], ['Token', PcdEntry.GetToken()], ['CName', PcdEntry.GetCName()], ['DatumType', PcdEntry.GetDatumType()], ['ValidUsage', GetStringOfList(PcdEntry.GetValidUsage())], ['DefaultValue', DefaultValue], ['MaxDatumSize', PcdEntry.GetMaxDatumSize()], ] for Item in PcdEntry.GetHelpTextList(): Tmp = HelpTextXml() NodeList.append(Tmp.ToXml(Item)) for Item in PcdEntry.GetPcdErrorsList(): Tmp = PcdErrorXml() NodeList.append(Tmp.ToXml(Item, 'PcdError')) Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList) return Root ## # Module will use ToXml3 # def ToXml3(self, PcdEntry, Key): if self.PcdCName: pass DefaultValue = ConvertNEToNOTEQ(PcdEntry.GetDefaultValue()) AttributeList = \ [['SupArchList', GetStringOfList(PcdEntry.GetSupArchList())], \ ['PcdUsage', PcdEntry.GetValidUsage()], \ ['PcdItemType', PcdEntry.GetItemType()], \ ['FeatureFlag', ConvertNEToNOTEQ(PcdEntry.GetFeatureFlag())], ] NodeList = [['CName', PcdEntry.GetCName()], ['TokenSpaceGuidCName', PcdEntry.GetTokenSpaceGuidCName()], ['DefaultValue', DefaultValue], ] for Item in PcdEntry.GetHelpTextList(): Tmp = HelpTextXml() NodeList.append(Tmp.ToXml(Item)) for Item in PcdEntry.GetPcdErrorsList(): Tmp = PcdErrorXml() NodeList.append(Tmp.ToXml(Item, 'PcdError')) Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList) return Root ## # AsBuild Module will use ToXml4 # def ToXml4(self, PcdEntry, Key): if self.PcdCName: pass DefaultValue = ConvertNEToNOTEQ(PcdEntry.GetDefaultValue()) AttributeList = [] NodeList = [ ['TokenSpaceGuidValue', PcdEntry.GetTokenSpaceGuidValue()], ['PcdCName', PcdEntry.GetCName()], ['Token', PcdEntry.GetToken()], ['DatumType', PcdEntry.GetDatumType()], ['MaxDatumSize', PcdEntry.GetMaxDatumSize()], ['Value', DefaultValue], ['Offset', PcdEntry.GetOffset()] ] for Item in PcdEntry.GetHelpTextList(): Tmp = HelpTextXml() NodeList.append(Tmp.ToXml(Item)) for Item in PcdEntry.GetPcdErrorsList(): Tmp = PcdErrorXml() NodeList.append(Tmp.ToXml(Item, 'PcdError')) Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList) return Root def __str__(self): Str = \ ('PcdItemType = %s PcdUsage = %s TokenSpaceGuidCName = %s \ TokenSpaceGuidValue = %s Token = %s CName = %s PcdCName = %s \ DatumType = %s ValidUsage = %s DefaultValue = %s MaxDatumSize = %s \ Value = %s Offset = %s %s') % \ (self.PcdItemType, self.PcdUsage, self.TokenSpaceGuidCName, \ self.TokenSpaceGuidValue, self.Token, self.CName, self.PcdCName, \ self.DatumType, self.ValidUsage, self.DefaultValue, \ self.MaxDatumSize, self.Value, self.Offset, self.CommonDefines) for Item in self.HelpText: Str = Str + "\n\t" + str(Item) for Item in self.PcdError: Str = Str + "\n\tPcdError:" + str(Item) return Str