2 # This file is used to parse a Package file of .PKG file
4 # Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
6 # SPDX-License-Identifier: BSD-2-Clause-Patent
12 from xml
.dom
import minidom
14 from Library
.StringUtils
import GetStringOfList
15 from Library
.Xml
.XmlRoutines
import XmlElement
16 from Library
.Xml
.XmlRoutines
import XmlNode
17 from Library
.Xml
.XmlRoutines
import XmlList
18 from Library
.Xml
.XmlRoutines
import CreateXmlElement
19 from Object
.POM
.CommonObject
import IncludeObject
20 from Object
.POM
.CommonObject
import TextObject
21 from Object
.POM
.PackageObject
import PackageObject
22 from Xml
.CommonXml
import ClonedFromXml
23 from Xml
.CommonXml
import PackageHeaderXml
24 from Xml
.CommonXml
import HelpTextXml
25 from Xml
.CommonXml
import CommonDefinesXml
26 from Xml
.CommonXml
import LibraryClassXml
27 from Xml
.CommonXml
import UserExtensionsXml
28 from Xml
.CommonXml
import MiscellaneousFileXml
29 from Xml
.GuidProtocolPpiXml
import GuidXml
30 from Xml
.GuidProtocolPpiXml
import ProtocolXml
31 from Xml
.GuidProtocolPpiXml
import PpiXml
32 from Xml
.ModuleSurfaceAreaXml
import ModuleSurfaceAreaXml
33 from Xml
.PcdXml
import PcdEntryXml
36 # IndustryStandardHeaderXml
38 class IndustryStandardHeaderXml(object):
43 def FromXml(self
, Item
, Key
):
44 self
.HeaderFile
= XmlElement(Item
, '%s/HeaderFile' % Key
)
45 for HelpTextItem
in XmlList(Item
, '%s/HelpText' % Key
):
46 HelpTextObj
= HelpTextXml()
47 HelpTextObj
.FromXml(HelpTextItem
, '%s/HelpText' % Key
)
48 self
.HelpText
.append(HelpTextObj
)
50 Include
= IncludeObject()
51 Include
.SetFilePath(self
.HeaderFile
)
52 HelpTxt
= TextObject()
53 HelpTxt
.SetString(self
.HelpText
)
54 Include
.SetHelpText(HelpTxt
)
58 def ToXml(self
, IndustryStandardHeader
, Key
):
62 NodeList
= [['HeaderFile', IndustryStandardHeader
.GetFilePath()]]
63 Root
= CreateXmlElement('%s' % Key
, '', NodeList
, AttributeList
)
68 Str
= "HeaderFile = %s" % (self
.HeaderFile
)
69 for Item
in self
.HelpText
:
70 Str
= Str
+ "\n\t" + str(Item
)
73 # PackageIncludeHeaderXml
75 class PackageIncludeHeaderXml(object):
78 self
.CommonDefines
= CommonDefinesXml()
81 def FromXml(self
, Item
, Key
):
82 self
.HeaderFile
= XmlElement(Item
, '%s/HeaderFile' % Key
)
83 self
.CommonDefines
.FromXml(XmlNode(Item
, '%s/HeaderFile' % Key
), 'HeaderFile')
84 for HelpTextItem
in XmlList(Item
, '%s/HelpText' % Key
):
85 HelpTextObj
= HelpTextXml()
86 HelpTextObj
.FromXml(HelpTextItem
, '%s/HelpText' % Key
)
87 self
.HelpText
.append(HelpTextObj
)
89 Include
= IncludeObject()
90 Include
.SetFilePath(self
.HeaderFile
)
91 Include
.SetSupArchList(self
.CommonDefines
.SupArchList
)
92 HelpTxt
= TextObject()
93 HelpTxt
.SetString(self
.HelpText
)
94 Include
.SetHelpText(HelpTxt
)
98 def ToXml(self
, PackageIncludeHeader
, Key
):
101 AttributeList
= [['SupArchList', GetStringOfList(PackageIncludeHeader
.GetSupArchList())], \
102 ['SupModList', GetStringOfList(PackageIncludeHeader
.GetSupModuleList())], ]
104 HeaderFileNode
= CreateXmlElement('HeaderFile', PackageIncludeHeader
.FilePath
, [], AttributeList
)
106 NodeList
= [HeaderFileNode
]
107 for Item
in PackageIncludeHeader
.GetHelpTextList():
109 NodeList
.append(Tmp
.ToXml(Item
))
111 Root
= CreateXmlElement('%s' % Key
, '', NodeList
, [])
116 Str
= "HeaderFile = %s\n\t%s" % (self
.HeaderFile
, self
.CommonDefines
)
117 for Item
in self
.HelpText
:
118 Str
= Str
+ "\n\t" + str(Item
)
124 class PcdCheckXml(object):
128 def FromXml(self
, Item
, Key
):
131 self
.PcdCheck
= XmlElement(Item
, 'PcdCheck')
135 def ToXml(self
, PcdCheck
, Key
):
138 Root
= CreateXmlElement('%s' % Key
, PcdCheck
, [], [])
142 return "PcdCheck = %s" % (self
.PcdCheck
)
145 # PackageSurfaceAreaXml
147 class PackageSurfaceAreaXml(object):
151 def FromXml(self
, Item
, Key
):
155 # Create a package object
157 Package
= PackageObject()
161 Tmp
= PackageHeaderXml()
162 Tmp
.FromXml(XmlNode(Item
, '/PackageSurfaceArea/Header'), 'Header', Package
)
166 Tmp
= ClonedFromXml()
167 if XmlNode(Item
, '/PackageSurfaceArea/ClonedFrom'):
168 ClonedFrom
= Tmp
.FromXml(XmlNode(Item
, '/PackageSurfaceArea/ClonedFrom'), 'ClonedFrom')
169 Package
.SetClonedFromList([ClonedFrom
])
174 for SubItem
in XmlList(Item
, '/PackageSurfaceArea/LibraryClassDeclarations/LibraryClass'):
175 Tmp
= LibraryClassXml()
176 LibraryClass
= Tmp
.FromXml(SubItem
, 'LibraryClass')
177 Package
.SetLibraryClassList(Package
.GetLibraryClassList() + [LibraryClass
])
179 if XmlList(Item
, '/PackageSurfaceArea/LibraryClassDeclarations') and \
180 not XmlList(Item
, '/PackageSurfaceArea/LibraryClassDeclarations/LibraryClass'):
181 Package
.SetLibraryClassList([None])
184 # IndustryStandardHeader
186 for SubItem
in XmlList(Item
, '/PackageSurfaceArea/IndustryStandardIncludes/IndustryStandardHeader'):
187 Tmp
= IndustryStandardHeaderXml()
188 Include
= Tmp
.FromXml(SubItem
, 'IndustryStandardHeader')
189 Package
.SetStandardIncludeFileList(Package
.GetStandardIncludeFileList() + [Include
])
191 if XmlList(Item
, '/PackageSurfaceArea/IndustryStandardIncludes') and \
192 not XmlList(Item
, '/PackageSurfaceArea/IndustryStandardIncludes/IndustryStandardHeader'):
193 Package
.SetStandardIncludeFileList([None])
199 for SubItem
in XmlList(Item
, '/PackageSurfaceArea/PackageIncludes/PackageHeader'):
200 Tmp
= PackageIncludeHeaderXml()
201 Include
= Tmp
.FromXml(SubItem
, 'PackageHeader')
202 Package
.SetPackageIncludeFileList(Package
.GetPackageIncludeFileList() + [Include
])
204 if XmlList(Item
, '/PackageSurfaceArea/PackageIncludes') and not \
205 XmlList(Item
, '/PackageSurfaceArea/PackageIncludes/PackageHeader'):
206 Package
.SetPackageIncludeFileList([None])
211 for SubItem
in XmlList(Item
, '/PackageSurfaceArea/GuidDeclarations/Entry'):
212 Tmp
= GuidXml('Package')
213 GuidProtocolPpi
= Tmp
.FromXml(SubItem
, 'Entry')
214 Package
.SetGuidList(Package
.GetGuidList() + [GuidProtocolPpi
])
216 if XmlList(Item
, '/PackageSurfaceArea/GuidDeclarations') and not \
217 XmlList(Item
, '/PackageSurfaceArea/GuidDeclarations/Entry'):
218 Package
.SetGuidList([None])
223 for SubItem
in XmlList(Item
, '/PackageSurfaceArea/ProtocolDeclarations/Entry'):
224 Tmp
= ProtocolXml('Package')
225 GuidProtocolPpi
= Tmp
.FromXml(SubItem
, 'Entry')
226 Package
.SetProtocolList(Package
.GetProtocolList() + [GuidProtocolPpi
])
228 if XmlList(Item
, '/PackageSurfaceArea/ProtocolDeclarations') and not \
229 XmlList(Item
, '/PackageSurfaceArea/ProtocolDeclarations/Entry'):
230 Package
.SetProtocolList([None])
235 for SubItem
in XmlList(Item
, '/PackageSurfaceArea/PpiDeclarations/Entry'):
236 Tmp
= PpiXml('Package')
237 GuidProtocolPpi
= Tmp
.FromXml(SubItem
, 'Entry')
238 Package
.SetPpiList(Package
.GetPpiList() + [GuidProtocolPpi
])
240 if XmlList(Item
, '/PackageSurfaceArea/PpiDeclarations') and not \
241 XmlList(Item
, '/PackageSurfaceArea/PpiDeclarations/Entry'):
242 Package
.SetPpiList([None])
247 for SubItem
in XmlList(Item
, '/PackageSurfaceArea/PcdDeclarations/PcdEntry'):
249 PcdEntry
= Tmp
.FromXml2(SubItem
, 'PcdEntry')
250 Package
.SetPcdList(Package
.GetPcdList() + [PcdEntry
])
253 # Get PcdErrorCommentDict from PcdError in PcdEntry Node
255 for PcdErrorObj
in PcdEntry
.GetPcdErrorsList():
256 PcdErrorMessageList
= PcdErrorObj
.GetErrorMessageList()
257 if PcdErrorMessageList
:
258 Package
.PcdErrorCommentDict
[(PcdEntry
.GetTokenSpaceGuidCName(), PcdErrorObj
.GetErrorNumber())] = \
262 if XmlList(Item
, '/PackageSurfaceArea/PcdDeclarations') and not \
263 XmlList(Item
, '/PackageSurfaceArea/PcdDeclarations/PcdEntry'):
264 Package
.SetPcdList([None])
269 for SubItem
in XmlList(Item
, '/PackageSurfaceArea/PcdRelationshipChecks/PcdCheck'):
271 PcdCheck
= Tmp
.FromXml(SubItem
, 'PcdCheck')
272 Package
.PcdChecks
.append(PcdCheck
)
277 for SubItem
in XmlList(Item
, '/PackageSurfaceArea/Modules/ModuleSurfaceArea'):
278 Tmp
= ModuleSurfaceAreaXml()
279 Module
= Tmp
.FromXml(SubItem
, 'ModuleSurfaceArea')
280 ModuleDictKey
= (Module
.GetGuid(), Module
.GetVersion(), Module
.GetName(), Module
.GetModulePath())
281 Package
.ModuleDict
[ModuleDictKey
] = Module
285 Tmp
= MiscellaneousFileXml()
286 MiscFileList
= Tmp
.FromXml(XmlNode(Item
, '/PackageSurfaceArea/MiscellaneousFiles'), 'MiscellaneousFiles')
288 Package
.SetMiscFileList([MiscFileList
])
290 Package
.SetMiscFileList([])
295 for Item
in XmlList(Item
, '/PackageSurfaceArea/UserExtensions'):
296 Tmp
= UserExtensionsXml()
297 UserExtension
= Tmp
.FromXml(Item
, 'UserExtensions')
298 Package
.UserExtensionList
.append(UserExtension
)
300 self
.Package
= Package
303 def ToXml(self
, Package
):
307 # Create PackageSurfaceArea node
309 DomPackage
= minidom
.Document().createElement('PackageSurfaceArea')
313 Tmp
= PackageHeaderXml()
314 DomPackage
.appendChild(Tmp
.ToXml(Package
, 'Header'))
318 Tmp
= ClonedFromXml()
319 if Package
.GetClonedFromList() != []:
320 DomPackage
.appendChild(Tmp
.ToXml(Package
.GetClonedFromList
[0], 'ClonedFrom'))
324 LibraryClassNode
= CreateXmlElement('LibraryClassDeclarations', '', [], [])
325 for LibraryClass
in Package
.GetLibraryClassList():
326 Tmp
= LibraryClassXml()
327 LibraryClassNode
.appendChild(Tmp
.ToXml(LibraryClass
, 'LibraryClass'))
328 DomPackage
.appendChild(LibraryClassNode
)
330 # IndustryStandardHeader
332 IndustryStandardHeaderNode
= CreateXmlElement('IndustryStandardIncludes', '', [], [])
333 for Include
in Package
.GetStandardIncludeFileList():
334 Tmp
= IndustryStandardHeaderXml()
335 IndustryStandardHeaderNode
.appendChild(Tmp
.ToXml(Include
, 'IndustryStandardHeader'))
336 DomPackage
.appendChild(IndustryStandardHeaderNode
)
340 PackageIncludeHeaderNode
= CreateXmlElement('PackageIncludes', '', [], [])
341 for Include
in Package
.GetPackageIncludeFileList():
342 Tmp
= PackageIncludeHeaderXml()
343 PackageIncludeHeaderNode
.appendChild(Tmp
.ToXml(Include
, 'PackageHeader'))
344 DomPackage
.appendChild(PackageIncludeHeaderNode
)
345 ModuleNode
= CreateXmlElement('Modules', '', [], [])
346 for Module
in Package
.GetModuleDict().values():
347 Tmp
= ModuleSurfaceAreaXml()
348 ModuleNode
.appendChild(Tmp
.ToXml(Module
))
349 DomPackage
.appendChild(ModuleNode
)
353 GuidProtocolPpiNode
= CreateXmlElement('GuidDeclarations', '', [], [])
354 for GuidProtocolPpi
in Package
.GetGuidList():
355 Tmp
= GuidXml('Package')
356 GuidProtocolPpiNode
.appendChild(Tmp
.ToXml\
357 (GuidProtocolPpi
, 'Entry'))
358 DomPackage
.appendChild(GuidProtocolPpiNode
)
362 GuidProtocolPpiNode
= \
363 CreateXmlElement('ProtocolDeclarations', '', [], [])
364 for GuidProtocolPpi
in Package
.GetProtocolList():
365 Tmp
= ProtocolXml('Package')
366 GuidProtocolPpiNode
.appendChild\
367 (Tmp
.ToXml(GuidProtocolPpi
, 'Entry'))
368 DomPackage
.appendChild(GuidProtocolPpiNode
)
372 GuidProtocolPpiNode
= CreateXmlElement('PpiDeclarations', '', [], [])
373 for GuidProtocolPpi
in Package
.GetPpiList():
374 Tmp
= PpiXml('Package')
375 GuidProtocolPpiNode
.appendChild\
376 (Tmp
.ToXml(GuidProtocolPpi
, 'Entry'))
377 DomPackage
.appendChild(GuidProtocolPpiNode
)
381 PcdEntryNode
= CreateXmlElement('PcdDeclarations', '', [], [])
382 for PcdEntry
in Package
.GetPcdList():
384 PcdEntryNode
.appendChild(Tmp
.ToXml2(PcdEntry
, 'PcdEntry'))
385 DomPackage
.appendChild(PcdEntryNode
)
390 Tmp
= MiscellaneousFileXml()
391 if Package
.GetMiscFileList():
392 DomPackage
.appendChild(Tmp
.ToXml(Package
.GetMiscFileList()[0], 'MiscellaneousFiles'))
397 if Package
.GetUserExtensionList():
398 for UserExtension
in Package
.GetUserExtensionList():
399 Tmp
= UserExtensionsXml()
400 DomPackage
.appendChild(Tmp
.ToXml(UserExtension
, 'UserExtensions'))