• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1## @file
2# This file is used to parse a Package file of .PKG file
3#
4# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>
5#
6# This program and the accompanying materials are licensed and made available
7# under the terms and conditions of the BSD License which accompanies this
8# distribution. The full text of the license may be found at
9# http://opensource.org/licenses/bsd-license.php
10#
11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13#
14
15'''
16PackageSurfaceAreaXml
17'''
18from xml.dom import minidom
19
20from Library.String import GetStringOfList
21from Library.Xml.XmlRoutines import XmlElement
22from Library.Xml.XmlRoutines import XmlNode
23from Library.Xml.XmlRoutines import XmlList
24from Library.Xml.XmlRoutines import CreateXmlElement
25from Object.POM.CommonObject import IncludeObject
26from Object.POM.CommonObject import TextObject
27from Object.POM.PackageObject import PackageObject
28from Xml.CommonXml import ClonedFromXml
29from Xml.CommonXml import PackageHeaderXml
30from Xml.CommonXml import HelpTextXml
31from Xml.CommonXml import CommonDefinesXml
32from Xml.CommonXml import LibraryClassXml
33from Xml.CommonXml import UserExtensionsXml
34from Xml.CommonXml import MiscellaneousFileXml
35from Xml.GuidProtocolPpiXml import GuidXml
36from Xml.GuidProtocolPpiXml import ProtocolXml
37from Xml.GuidProtocolPpiXml import PpiXml
38from Xml.ModuleSurfaceAreaXml import ModuleSurfaceAreaXml
39from Xml.PcdXml import PcdEntryXml
40
41##
42# IndustryStandardHeaderXml
43#
44class IndustryStandardHeaderXml(object):
45    def __init__(self):
46        self.HeaderFile = ''
47        self.HelpText = []
48
49    def FromXml(self, Item, Key):
50        self.HeaderFile = XmlElement(Item, '%s/HeaderFile' % Key)
51        for HelpTextItem in XmlList(Item, '%s/HelpText' % Key):
52            HelpTextObj = HelpTextXml()
53            HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key)
54            self.HelpText.append(HelpTextObj)
55
56        Include = IncludeObject()
57        Include.SetFilePath(self.HeaderFile)
58        HelpTxt = TextObject()
59        HelpTxt.SetString(self.HelpText)
60        Include.SetHelpText(HelpTxt)
61
62        return Include
63
64    def ToXml(self, IndustryStandardHeader, Key):
65        if self.HeaderFile:
66            pass
67        AttributeList = []
68        NodeList = [['HeaderFile', IndustryStandardHeader.GetFilePath()]]
69        Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)
70
71        return Root
72
73    def __str__(self):
74        Str = "HeaderFile = %s" % (self.HeaderFile)
75        for Item in self.HelpText:
76            Str = Str + "\n\t" + str(Item)
77        return Str
78##
79# PackageIncludeHeaderXml
80#
81class PackageIncludeHeaderXml(object):
82    def __init__(self):
83        self.HeaderFile = ''
84        self.CommonDefines = CommonDefinesXml()
85        self.HelpText = []
86
87    def FromXml(self, Item, Key):
88        self.HeaderFile = XmlElement(Item, '%s/HeaderFile' % Key)
89        self.CommonDefines.FromXml(XmlNode(Item, '%s/HeaderFile' % Key), 'HeaderFile')
90        for HelpTextItem in XmlList(Item, '%s/HelpText' % Key):
91            HelpTextObj = HelpTextXml()
92            HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key)
93            self.HelpText.append(HelpTextObj)
94
95        Include = IncludeObject()
96        Include.SetFilePath(self.HeaderFile)
97        Include.SetSupArchList(self.CommonDefines.SupArchList)
98        HelpTxt = TextObject()
99        HelpTxt.SetString(self.HelpText)
100        Include.SetHelpText(HelpTxt)
101
102        return Include
103
104    def ToXml(self, PackageIncludeHeader, Key):
105        if self.HeaderFile:
106            pass
107        AttributeList = [['SupArchList', GetStringOfList(PackageIncludeHeader.GetSupArchList())], \
108                         ['SupModList', GetStringOfList(PackageIncludeHeader.GetSupModuleList())], ]
109
110        HeaderFileNode = CreateXmlElement('HeaderFile', PackageIncludeHeader.FilePath, [], AttributeList)
111
112        NodeList = [HeaderFileNode]
113        for Item in PackageIncludeHeader.GetHelpTextList():
114            Tmp = HelpTextXml()
115            NodeList.append(Tmp.ToXml(Item))
116
117        Root = CreateXmlElement('%s' % Key, '', NodeList, [])
118
119        return Root
120
121    def __str__(self):
122        Str = "HeaderFile = %s\n\t%s" % (self.HeaderFile, self.CommonDefines)
123        for Item in self.HelpText:
124            Str = Str + "\n\t" + str(Item)
125        return Str
126
127##
128# PcdCheckXml
129#
130class PcdCheckXml(object):
131    def __init__(self):
132        self.PcdCheck = ''
133
134    def FromXml(self, Item, Key):
135        if Key:
136            pass
137        self.PcdCheck = XmlElement(Item, 'PcdCheck')
138
139        return self.PcdCheck
140
141    def ToXml(self, PcdCheck, Key):
142        if self.PcdCheck:
143            pass
144        Root = CreateXmlElement('%s' % Key, PcdCheck, [], [])
145        return Root
146
147    def __str__(self):
148        return "PcdCheck = %s" % (self.PcdCheck)
149
150##
151# PackageSurfaceAreaXml
152#
153class PackageSurfaceAreaXml(object):
154    def __init__(self):
155        self.Package = None
156
157    def FromXml(self, Item, Key):
158        if Key:
159            pass
160        #
161        # Create a package object
162        #
163        Package = PackageObject()
164        #
165        # Header
166        #
167        Tmp = PackageHeaderXml()
168        Tmp.FromXml(XmlNode(Item, '/PackageSurfaceArea/Header'), 'Header', Package)
169        #
170        # ClonedFrom
171        #
172        Tmp = ClonedFromXml()
173        if XmlNode(Item, '/PackageSurfaceArea/ClonedFrom'):
174            ClonedFrom = Tmp.FromXml(XmlNode(Item, '/PackageSurfaceArea/ClonedFrom'), 'ClonedFrom')
175            Package.SetClonedFromList([ClonedFrom])
176        #
177        # LibraryClass
178        #
179
180        for SubItem in XmlList(Item, '/PackageSurfaceArea/LibraryClassDeclarations/LibraryClass'):
181            Tmp = LibraryClassXml()
182            LibraryClass = Tmp.FromXml(SubItem, 'LibraryClass')
183            Package.SetLibraryClassList(Package.GetLibraryClassList() + [LibraryClass])
184
185        if XmlList(Item, '/PackageSurfaceArea/LibraryClassDeclarations') and \
186           not XmlList(Item, '/PackageSurfaceArea/LibraryClassDeclarations/LibraryClass'):
187            Package.SetLibraryClassList([None])
188
189        #
190        # IndustryStandardHeader
191        #
192        for SubItem in XmlList(Item, '/PackageSurfaceArea/IndustryStandardIncludes/IndustryStandardHeader'):
193            Tmp = IndustryStandardHeaderXml()
194            Include = Tmp.FromXml(SubItem, 'IndustryStandardHeader')
195            Package.SetStandardIncludeFileList(Package.GetStandardIncludeFileList() + [Include])
196
197        if XmlList(Item, '/PackageSurfaceArea/IndustryStandardIncludes') and \
198        not XmlList(Item, '/PackageSurfaceArea/IndustryStandardIncludes/IndustryStandardHeader'):
199            Package.SetStandardIncludeFileList([None])
200
201
202        #
203        # PackageHeader
204        #
205        for SubItem in XmlList(Item, '/PackageSurfaceArea/PackageIncludes/PackageHeader'):
206            Tmp = PackageIncludeHeaderXml()
207            Include = Tmp.FromXml(SubItem, 'PackageHeader')
208            Package.SetPackageIncludeFileList(Package.GetPackageIncludeFileList() + [Include])
209
210        if XmlList(Item, '/PackageSurfaceArea/PackageIncludes') and not \
211           XmlList(Item, '/PackageSurfaceArea/PackageIncludes/PackageHeader'):
212            Package.SetPackageIncludeFileList([None])
213
214        #
215        # Guid
216        #
217        for SubItem in XmlList(Item, '/PackageSurfaceArea/GuidDeclarations/Entry'):
218            Tmp = GuidXml('Package')
219            GuidProtocolPpi = Tmp.FromXml(SubItem, 'Entry')
220            Package.SetGuidList(Package.GetGuidList() + [GuidProtocolPpi])
221
222        if XmlList(Item, '/PackageSurfaceArea/GuidDeclarations') and not \
223           XmlList(Item, '/PackageSurfaceArea/GuidDeclarations/Entry'):
224            Package.SetGuidList([None])
225
226        #
227        # Protocol
228        #
229        for SubItem in XmlList(Item, '/PackageSurfaceArea/ProtocolDeclarations/Entry'):
230            Tmp = ProtocolXml('Package')
231            GuidProtocolPpi = Tmp.FromXml(SubItem, 'Entry')
232            Package.SetProtocolList(Package.GetProtocolList() + [GuidProtocolPpi])
233
234        if XmlList(Item, '/PackageSurfaceArea/ProtocolDeclarations') and not \
235           XmlList(Item, '/PackageSurfaceArea/ProtocolDeclarations/Entry'):
236            Package.SetProtocolList([None])
237
238        #
239        # Ppi
240        #
241        for SubItem in XmlList(Item, '/PackageSurfaceArea/PpiDeclarations/Entry'):
242            Tmp = PpiXml('Package')
243            GuidProtocolPpi = Tmp.FromXml(SubItem, 'Entry')
244            Package.SetPpiList(Package.GetPpiList() + [GuidProtocolPpi])
245
246        if XmlList(Item, '/PackageSurfaceArea/PpiDeclarations') and not \
247           XmlList(Item, '/PackageSurfaceArea/PpiDeclarations/Entry'):
248            Package.SetPpiList([None])
249
250        #
251        # PcdEntry
252        #
253        for SubItem in XmlList(Item, '/PackageSurfaceArea/PcdDeclarations/PcdEntry'):
254            Tmp = PcdEntryXml()
255            PcdEntry = Tmp.FromXml2(SubItem, 'PcdEntry')
256            Package.SetPcdList(Package.GetPcdList() + [PcdEntry])
257
258            #
259            # Get PcdErrorCommentDict from PcdError in PcdEntry Node
260            #
261            for PcdErrorObj in PcdEntry.GetPcdErrorsList():
262                PcdErrorMessageList = PcdErrorObj.GetErrorMessageList()
263                if PcdErrorMessageList:
264                    Package.PcdErrorCommentDict[(PcdEntry.GetTokenSpaceGuidCName(), PcdErrorObj.GetErrorNumber())] = \
265                    PcdErrorMessageList
266
267
268        if XmlList(Item, '/PackageSurfaceArea/PcdDeclarations') and not \
269           XmlList(Item, '/PackageSurfaceArea/PcdDeclarations/PcdEntry'):
270            Package.SetPcdList([None])
271
272        #
273        # PcdCheck
274        #
275        for SubItem in XmlList(Item, '/PackageSurfaceArea/PcdRelationshipChecks/PcdCheck'):
276            Tmp = PcdCheckXml()
277            PcdCheck = Tmp.FromXml(SubItem, 'PcdCheck')
278            Package.PcdChecks.append(PcdCheck)
279
280        #
281        # Modules
282        #
283        for SubItem in XmlList(Item, '/PackageSurfaceArea/Modules/ModuleSurfaceArea'):
284            Tmp = ModuleSurfaceAreaXml()
285            Module = Tmp.FromXml(SubItem, 'ModuleSurfaceArea')
286            ModuleDictKey = (Module.GetGuid(), Module.GetVersion(), Module.GetName(), Module.GetModulePath())
287            Package.ModuleDict[ModuleDictKey] = Module
288        #
289        # MiscellaneousFile
290        #
291        Tmp = MiscellaneousFileXml()
292        MiscFileList = Tmp.FromXml(XmlNode(Item, '/PackageSurfaceArea/MiscellaneousFiles'), 'MiscellaneousFiles')
293        if MiscFileList:
294            Package.SetMiscFileList([MiscFileList])
295        else:
296            Package.SetMiscFileList([])
297
298        #
299        # UserExtensions
300        #
301        for Item in XmlList(Item, '/PackageSurfaceArea/UserExtensions'):
302            Tmp = UserExtensionsXml()
303            UserExtension = Tmp.FromXml(Item, 'UserExtensions')
304            Package.UserExtensionList.append(UserExtension)
305
306        self.Package = Package
307        return self.Package
308
309    def ToXml(self, Package):
310        if self.Package:
311            pass
312        #
313        # Create PackageSurfaceArea node
314        #
315        DomPackage = minidom.Document().createElement('PackageSurfaceArea')
316        #
317        # Header
318        #
319        Tmp = PackageHeaderXml()
320        DomPackage.appendChild(Tmp.ToXml(Package, 'Header'))
321        #
322        # ClonedFrom
323        #
324        Tmp = ClonedFromXml()
325        if Package.GetClonedFromList() != []:
326            DomPackage.appendChild(Tmp.ToXml(Package.GetClonedFromList[0], 'ClonedFrom'))
327        #
328        # LibraryClass
329        #
330        LibraryClassNode = CreateXmlElement('LibraryClassDeclarations', '', [], [])
331        for LibraryClass in Package.GetLibraryClassList():
332            Tmp = LibraryClassXml()
333            LibraryClassNode.appendChild(Tmp.ToXml(LibraryClass, 'LibraryClass'))
334        DomPackage.appendChild(LibraryClassNode)
335        #
336        # IndustryStandardHeader
337        #
338        IndustryStandardHeaderNode = CreateXmlElement('IndustryStandardIncludes', '', [], [])
339        for Include in Package.GetStandardIncludeFileList():
340            Tmp = IndustryStandardHeaderXml()
341            IndustryStandardHeaderNode.appendChild(Tmp.ToXml(Include, 'IndustryStandardHeader'))
342        DomPackage.appendChild(IndustryStandardHeaderNode)
343        #
344        # PackageHeader
345        #
346        PackageIncludeHeaderNode = CreateXmlElement('PackageIncludes', '', [], [])
347        for Include in Package.GetPackageIncludeFileList():
348            Tmp = PackageIncludeHeaderXml()
349            PackageIncludeHeaderNode.appendChild(Tmp.ToXml(Include, 'PackageHeader'))
350        DomPackage.appendChild(PackageIncludeHeaderNode)
351        ModuleNode = CreateXmlElement('Modules', '', [], [])
352        for Module in Package.GetModuleDict().values():
353            Tmp = ModuleSurfaceAreaXml()
354            ModuleNode.appendChild(Tmp.ToXml(Module))
355        DomPackage.appendChild(ModuleNode)
356        #
357        # Guid
358        #
359        GuidProtocolPpiNode = CreateXmlElement('GuidDeclarations', '', [], [])
360        for GuidProtocolPpi in Package.GetGuidList():
361            Tmp = GuidXml('Package')
362            GuidProtocolPpiNode.appendChild(Tmp.ToXml\
363                                            (GuidProtocolPpi, 'Entry'))
364        DomPackage.appendChild(GuidProtocolPpiNode)
365        #
366        # Protocol
367        #
368        GuidProtocolPpiNode = \
369        CreateXmlElement('ProtocolDeclarations', '', [], [])
370        for GuidProtocolPpi in Package.GetProtocolList():
371            Tmp = ProtocolXml('Package')
372            GuidProtocolPpiNode.appendChild\
373            (Tmp.ToXml(GuidProtocolPpi, 'Entry'))
374        DomPackage.appendChild(GuidProtocolPpiNode)
375        #
376        # Ppi
377        #
378        GuidProtocolPpiNode = CreateXmlElement('PpiDeclarations', '', [], [])
379        for GuidProtocolPpi in Package.GetPpiList():
380            Tmp = PpiXml('Package')
381            GuidProtocolPpiNode.appendChild\
382            (Tmp.ToXml(GuidProtocolPpi, 'Entry'))
383        DomPackage.appendChild(GuidProtocolPpiNode)
384        #
385        # PcdEntry
386        #
387        PcdEntryNode = CreateXmlElement('PcdDeclarations', '', [], [])
388        for PcdEntry in Package.GetPcdList():
389            Tmp = PcdEntryXml()
390            PcdEntryNode.appendChild(Tmp.ToXml2(PcdEntry, 'PcdEntry'))
391        DomPackage.appendChild(PcdEntryNode)
392
393        #
394        # MiscellaneousFile
395        #
396        Tmp = MiscellaneousFileXml()
397        if Package.GetMiscFileList():
398            DomPackage.appendChild(Tmp.ToXml(Package.GetMiscFileList()[0], 'MiscellaneousFiles'))
399
400        #
401        # UserExtensions
402        #
403        if Package.GetUserExtensionList():
404            for UserExtension in Package.GetUserExtensionList():
405                Tmp = UserExtensionsXml()
406                DomPackage.appendChild(Tmp.ToXml(UserExtension, 'UserExtensions'))
407
408        return DomPackage
409