]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/Xml/ModuleSurfaceAreaXml.py
Sync BaseTool trunk (version r2670) into EDKII BaseTools.
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Xml / ModuleSurfaceAreaXml.py
CommitLineData
4234283c
LG
1## @file\r
2# This file is used to parse a Module file of .PKG file\r
3#\r
e4ac870f 4# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
4234283c
LG
5#\r
6# This program and the accompanying materials are licensed and made available \r
7# under the terms and conditions of the BSD License which accompanies this \r
8# distribution. The full text of the license may be found at \r
9# http://opensource.org/licenses/bsd-license.php\r
10#\r
11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13#\r
14\r
15'''\r
16ModuleSurfaceAreaXml\r
17'''\r
18from xml.dom import minidom\r
19\r
20from Library.String import ConvertNEToNOTEQ\r
21from Library.String import ConvertNOTEQToNE\r
22from Library.String import GetStringOfList\r
e4ac870f 23from Library.String import IsMatchArch\r
4234283c
LG
24from Library.Xml.XmlRoutines import XmlElement\r
25from Library.Xml.XmlRoutines import XmlAttribute\r
26from Library.Xml.XmlRoutines import XmlNode\r
27from Library.Xml.XmlRoutines import XmlList\r
28from Library.Xml.XmlRoutines import CreateXmlElement\r
29from Object.POM.CommonObject import GuidVersionObject\r
30from Object.POM.ModuleObject import BootModeObject\r
31from Object.POM.ModuleObject import DepexObject\r
32from Object.POM.ModuleObject import ModuleObject\r
33from Object.POM.ModuleObject import EventObject\r
34from Object.POM.ModuleObject import HobObject\r
35from Object.POM.ModuleObject import SourceFileObject\r
36from Object.POM.ModuleObject import PackageDependencyObject\r
37from Object.POM.ModuleObject import ExternObject\r
38from Object.POM.ModuleObject import BinaryFileObject\r
39from Object.POM.ModuleObject import AsBuiltObject\r
40from Object.POM.ModuleObject import BinaryBuildFlagObject\r
41from Xml.CommonXml import ClonedFromXml\r
42from Xml.CommonXml import HeaderXml\r
43from Xml.CommonXml import HelpTextXml\r
44from Xml.CommonXml import CommonDefinesXml\r
45from Xml.CommonXml import LibraryClassXml\r
46from Xml.CommonXml import UserExtensionsXml\r
47from Xml.CommonXml import MiscellaneousFileXml\r
48from Xml.CommonXml import FilenameXml\r
49from Xml.GuidProtocolPpiXml import GuidXml\r
50from Xml.GuidProtocolPpiXml import ProtocolXml\r
51from Xml.GuidProtocolPpiXml import PpiXml\r
52from Xml.PcdXml import PcdEntryXml\r
53from Xml.XmlParserMisc import GetHelpTextList\r
54from Library import GlobalData\r
55from Library.Misc import GetSplitValueList\r
56\r
57## BinaryFileXml\r
58#\r
59# represent the following XML item\r
60#\r
61# <BinaryFile>\r
62# <Filename\r
63# FileType=" FileType " {1}\r
64# SupArchList=" ArchListType " {0,1}\r
65# FeatureFlag=" FeatureFlagExpression " {0,1} >\r
66# xs:anyURI\r
67# </Filename> {1,}\r
68# <AsBuilt> ... </AsBuilt> {0,}\r
69# </BinaryFile> {1,}\r
70# \r
71class BinaryFileXml(object):\r
72 def __init__(self):\r
73 self.FileNames = []\r
74 self.AsBuiltList = []\r
75 self.PatchPcdValues = ''\r
76 self.PcdExValues = ''\r
77 self.LibraryInstances = ''\r
78 self.BuildFlags = ''\r
79\r
80 def FromXml(self, Item, Key):\r
81 if self.FileNames:\r
82 pass\r
83 BinaryFile = BinaryFileObject()\r
84 FilenameList = []\r
85 for SubItem in XmlList(Item, '%s/Filename' % Key):\r
86 Axml = FilenameXml()\r
87 Bxml = Axml.FromXml(SubItem, 'Filename')\r
88 FilenameList.append(Bxml)\r
89 BinaryFile.SetFileNameList(FilenameList)\r
90 if GlobalData.gIS_BINARY_INF:\r
91 AsBuiltList = []\r
92 for AsBuiltItem in XmlList(Item, '%s/AsBuilt' % Key):\r
93 AsBuilt = AsBuiltObject()\r
94\r
95 PatchPcdValueList = []\r
96 for SubItem in XmlList(AsBuiltItem, 'AsBuilt/PatchPcdValue'):\r
97 Axml = PcdEntryXml()\r
98 Bxml = Axml.FromXml(SubItem, 'PatchPcdValue')\r
99 PatchPcdValueList.append(Bxml)\r
100 AsBuilt.SetPatchPcdList(PatchPcdValueList)\r
101 PcdExValueList = []\r
102 for SubItem in XmlList(AsBuiltItem, 'AsBuilt/PcdExValue'):\r
103 Axml = PcdEntryXml()\r
104 Bxml = Axml.FromXml(SubItem, 'PcdExValue')\r
105 PcdExValueList.append(Bxml)\r
106 AsBuilt.SetPcdExList(PcdExValueList)\r
107 LibraryList = []\r
108 for SubItem in XmlList(Item, '%s/AsBuilt/LibraryInstances/GUID' % Key):\r
109 GuidVerObj = GuidVersionObject()\r
110 GUID = XmlElement(SubItem, 'GUID')\r
111 Version = XmlAttribute(XmlNode(SubItem, 'GUID'), 'Version')\r
112 GuidVerObj.SetGuid(GUID)\r
113 GuidVerObj.SetVersion(Version)\r
114 LibraryList.append(GuidVerObj)\r
115 if XmlList(Item, '%s/AsBuilt/LibraryInstances' % Key) and not LibraryList:\r
116 LibraryList = [None]\r
117 AsBuilt.SetLibraryInstancesList(LibraryList)\r
118 BuildFlagList = []\r
119 for SubItem in XmlList(Item, '%s/AsBuilt/BuildFlags' % Key):\r
120 BuildFlag = BuildFlagXml()\r
121 BuildFlagList.append(BuildFlag.FromXml2(SubItem, 'BuildFlags'))\r
122 AsBuilt.SetBuildFlagsList(BuildFlagList)\r
123 AsBuiltList.append(AsBuilt)\r
124 BinaryFile.SetAsBuiltList(AsBuiltList)\r
125 return BinaryFile\r
126\r
127 def ToXml(self, BinaryFile, Key):\r
128 if self.FileNames:\r
129 pass\r
130 NodeList = []\r
131 FilenameList = BinaryFile.GetFileNameList()\r
e4ac870f 132 SupportArch = None\r
4234283c
LG
133 for Filename in FilenameList:\r
134 Tmp = FilenameXml()\r
135 NodeList.append(Tmp.ToXml(Filename, 'Filename'))\r
e4ac870f 136 SupportArch = Filename.SupArchList\r
4234283c
LG
137\r
138 if GlobalData.gIS_BINARY_INF:\r
139 AsBuildList = BinaryFile.GetAsBuiltList()\r
140 PatchPcdValueList = AsBuildList.GetPatchPcdList()\r
141 PcdExList = AsBuildList.GetPcdExList()\r
142 LibGuidVerList = AsBuildList.GetLibraryInstancesList()\r
143 BuildFlagList = AsBuildList.GetBuildFlagsList()\r
144\r
145 AsBuiltNodeList = []\r
146\r
147 for Pcd in PatchPcdValueList:\r
e4ac870f
LG
148 if IsMatchArch(Pcd.SupArchList, SupportArch):\r
149 Tmp = PcdEntryXml()\r
150 AsBuiltNodeList.append(Tmp.ToXml4(Pcd, 'PatchPcdValue'))\r
4234283c
LG
151\r
152 for Pcd in PcdExList:\r
e4ac870f
LG
153 if IsMatchArch(Pcd.SupArchList, SupportArch):\r
154 Tmp = PcdEntryXml()\r
155 AsBuiltNodeList.append(Tmp.ToXml4(Pcd, 'PcdExValue'))\r
4234283c
LG
156\r
157 GuiVerElemList = []\r
158 for LibGuidVer in LibGuidVerList:\r
159 GuiVerElem = \\r
160 CreateXmlElement('GUID', LibGuidVer.GetLibGuid(), [], [['Version', LibGuidVer.GetLibVersion()]])\r
161 GuiVerElemList.append(GuiVerElem)\r
162 if len(GuiVerElemList) > 0:\r
163 LibGuidVerElem = CreateXmlElement('LibraryInstances', '', GuiVerElemList, [])\r
164 AsBuiltNodeList.append(LibGuidVerElem)\r
165\r
166 for BuildFlag in BuildFlagList:\r
167 Tmp = BuildFlagXml()\r
168 Elem = CreateXmlElement('BuildFlags', ''.join(BuildFlag), [], [])\r
169 AsBuiltNodeList.append(Elem)\r
170\r
171 if len(AsBuiltNodeList) > 0:\r
172 Element = CreateXmlElement('AsBuilt', '', AsBuiltNodeList, [])\r
173 NodeList.append(Element)\r
174\r
175 Root = CreateXmlElement('%s' % Key, '', NodeList, [])\r
176\r
177 return Root\r
178\r
179 def __str__(self):\r
180 Str = "BinaryFiles:"\r
181 for Item in self.FileNames:\r
182 Str = Str + '\n\t' + str(Item)\r
183 for Item in self.PatchPcdValues:\r
184 Str = Str + '\n\t' + str(Item)\r
185 for Item in self.PcdExValues:\r
186 Str = Str + '\n\t' + str(Item)\r
187 for Item in self.LibraryInstances:\r
188 Str = Str + '\n\t' + str(Item)\r
189 for Item in self.BuildFlags:\r
190 Str = Str + '\n\t' + str(Item)\r
191 return Str\r
192\r
193##\r
194# PackageXml\r
195#\r
196class PackageXml(object):\r
197 def __init__(self):\r
198 self.Description = ''\r
199 self.Guid = ''\r
200 self.Version = ''\r
201 self.CommonDefines = CommonDefinesXml()\r
202\r
203 def FromXml(self, Item, Key):\r
204 self.Description = XmlElement(Item, '%s/Description' % Key)\r
205 self.Guid = XmlElement(Item, '%s/GUID' % Key)\r
206 self.Version = XmlAttribute(XmlNode(Item, '%s/GUID' % Key), 'Version')\r
207 self.CommonDefines.FromXml(XmlNode(Item, '%s' % Key), Key)\r
208\r
209 PackageDependency = PackageDependencyObject()\r
210 PackageDependency.SetPackage(self.Description)\r
211 PackageDependency.SetGuid(self.Guid)\r
212 PackageDependency.SetVersion(self.Version)\r
213 PackageDependency.SetFeatureFlag(ConvertNOTEQToNE(self.CommonDefines.FeatureFlag))\r
214 PackageDependency.SetSupArchList(self.CommonDefines.SupArchList)\r
215\r
216 return PackageDependency\r
217\r
218 def ToXml(self, PackageDependency, Key):\r
219 if self.Guid:\r
220 pass\r
221 AttributeList = [['SupArchList', GetStringOfList(PackageDependency.GetSupArchList())],\r
222 ['FeatureFlag', ConvertNEToNOTEQ(PackageDependency.GetFeatureFlag())], ]\r
223 Element1 = CreateXmlElement('GUID', PackageDependency.GetGuid(), [],\r
224 [['Version', PackageDependency.GetVersion()]])\r
225 NodeList = [['Description', PackageDependency.GetPackage()], Element1, ]\r
226 Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
227\r
228 return Root\r
229\r
230 def __str__(self):\r
231 Str = "Description = %s Guid = %s Version = %s %s" \\r
232 % (self.Description, self.Guid, self.Version, self.CommonDefines)\r
233 return Str\r
234##\r
235# ExternXml\r
236#\r
237class ExternXml(object):\r
238 def __init__(self):\r
239 self.CommonDefines = CommonDefinesXml()\r
240 self.EntryPoint = ''\r
241 self.UnloadImage = ''\r
242 self.Constructor = ''\r
243 self.Destructor = ''\r
244 self.SupModList = ''\r
245 self.SupArchList = ''\r
246 self.HelpText = []\r
247\r
248 def FromXml(self, Item, Key):\r
249 self.CommonDefines.FromXml(Item, Key)\r
250 self.EntryPoint = XmlElement(Item, '%s/EntryPoint' % Key)\r
251 self.UnloadImage = XmlElement(Item, '%s/UnloadImage' % Key)\r
252 self.Constructor = XmlElement(Item, '%s/Constructor' % Key)\r
253 self.Destructor = XmlElement(Item, '%s/Destructor' % Key)\r
254\r
255 Extern = ExternObject()\r
256 Extern.SetEntryPoint(self.EntryPoint)\r
257 Extern.SetUnloadImage(self.UnloadImage)\r
258 Extern.SetConstructor(self.Constructor)\r
259 Extern.SetDestructor(self.Destructor)\r
260 if self.CommonDefines.SupModList:\r
261 Extern.SetSupModList(self.CommonDefines.SupModList)\r
262 if self.CommonDefines.SupArchList:\r
263 Extern.SetSupArchList(self.CommonDefines.SupArchList)\r
264 return Extern\r
265\r
266 def ToXml(self, Extern, Key):\r
267 if self.HelpText:\r
268 pass\r
269\r
270 NodeList = []\r
271 if Extern.GetEntryPoint():\r
272 NodeList.append(['EntryPoint', Extern.GetEntryPoint()])\r
273 if Extern.GetUnloadImage():\r
274 NodeList.append(['UnloadImage', Extern.GetUnloadImage()])\r
275 if Extern.GetConstructor():\r
276 NodeList.append(['Constructor', Extern.GetConstructor()])\r
277 if Extern.GetDestructor():\r
278 NodeList.append(['Destructor', Extern.GetDestructor()])\r
279 Root = CreateXmlElement('%s' % Key, '', NodeList, [])\r
280\r
281 return Root\r
282\r
283 def __str__(self):\r
284 Str = "EntryPoint = %s UnloadImage = %s Constructor = %s Destructor = %s %s" \\r
285 % (self.EntryPoint, self.UnloadImage, self.Constructor, self.Destructor, self.CommonDefines)\r
286 for Item in self.HelpText:\r
287 Str = Str + '\n\t' + str(Item)\r
288 return Str\r
289## \r
290# DepexXml\r
291#\r
292class DepexXml(object):\r
293 def __init__(self):\r
294 self.CommonDefines = CommonDefinesXml()\r
295 self.Expression = None\r
296 self.HelpText = []\r
297\r
298 def FromXml(self, Item, Key):\r
299 if not Item:\r
300 return None\r
301 self.CommonDefines.FromXml(Item, Key)\r
302 self.Expression = XmlElement(Item, '%s/Expression' % Key)\r
303 for HelpTextItem in XmlList(Item, '%s/HelpText' % Key):\r
304 HelpTextObj = HelpTextXml()\r
305 HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key)\r
306 self.HelpText.append(HelpTextObj)\r
307\r
308 Depex = DepexObject()\r
309 Depex.SetDepex(self.Expression)\r
310 Depex.SetModuleType(self.CommonDefines.SupModList)\r
311 Depex.SetSupArchList(self.CommonDefines.SupArchList)\r
312 Depex.SetFeatureFlag(self.CommonDefines.FeatureFlag)\r
313 Depex.SetHelpTextList(GetHelpTextList(self.HelpText))\r
314\r
315 return Depex\r
316\r
317 def ToXml(self, Depex, Key):\r
318 if self.HelpText:\r
319 pass\r
320 AttributeList = [['SupArchList', GetStringOfList(Depex.GetSupArchList())],\r
321 ['SupModList', Depex.GetModuleType()]]\r
322 NodeList = [['Expression', Depex.GetDepex()]]\r
323 if Depex.GetHelpText():\r
324 Tmp = HelpTextXml()\r
325 NodeList.append(Tmp.ToXml(Depex.GetHelpText(), 'HelpText'))\r
326\r
327 Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
328 return Root\r
329\r
330 def __str__(self):\r
331 Str = "Expression = %s" % (self.Expression)\r
332 for Item in self.HelpText:\r
333 Str = Str + '\n\t' + str(Item)\r
334 return Str\r
335\r
336##\r
337# BootModeXml\r
338#\r
339class BootModeXml(object):\r
340 def __init__(self):\r
341 self.SupportedBootModes = ''\r
342 self.CommonDefines = CommonDefinesXml()\r
343 self.HelpText = []\r
344\r
345 def FromXml(self, Item, Key):\r
346 self.SupportedBootModes = \\r
347 XmlElement(Item, '%s/SupportedBootModes' % Key)\r
348 self.CommonDefines.FromXml(Item, Key)\r
349 for HelpTextItem in XmlList(Item, '%s/HelpText' % Key):\r
350 HelpTextObj = HelpTextXml()\r
351 HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key)\r
352 self.HelpText.append(HelpTextObj)\r
353\r
354 BootMode = BootModeObject()\r
355 BootMode.SetSupportedBootModes(self.SupportedBootModes)\r
356 BootMode.SetUsage(self.CommonDefines.Usage)\r
357 BootMode.SetHelpTextList(GetHelpTextList(self.HelpText))\r
358\r
359 return BootMode\r
360\r
361 def ToXml(self, BootMode, Key):\r
362 if self.HelpText:\r
363 pass\r
364 AttributeList = [['Usage', BootMode.GetUsage()], ]\r
365 NodeList = [['SupportedBootModes', BootMode.GetSupportedBootModes()]]\r
366 for Item in BootMode.GetHelpTextList():\r
367 Tmp = HelpTextXml()\r
368 NodeList.append(Tmp.ToXml(Item, 'HelpText'))\r
369 Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
370\r
371 return Root\r
372\r
373 def __str__(self):\r
374 Str = "SupportedBootModes = %s %s" % (self.SupportedBootModes, self.CommonDefines)\r
375 for Item in self.HelpText:\r
376 Str = Str + '\n\t' + str(Item)\r
377 return Str\r
378##\r
379# EventXml\r
380#\r
381class EventXml(object):\r
382 def __init__(self):\r
383 self.EventType = ''\r
384 self.Name = ''\r
385 self.CommonDefines = CommonDefinesXml()\r
386 self.HelpText = []\r
387\r
388 def FromXml(self, Item, Key):\r
389 self.EventType = XmlAttribute(XmlNode(Item, '%s' % Key), 'EventType')\r
390 self.Name = XmlElement(Item, '%s' % Key)\r
391 self.CommonDefines.FromXml(Item, Key)\r
392 for HelpTextItem in XmlList(Item, '%s/HelpText' % Key):\r
393 HelpTextObj = HelpTextXml()\r
394 HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key)\r
395 self.HelpText.append(HelpTextObj)\r
396\r
397 Event = EventObject()\r
398 Event.SetEventType(self.EventType)\r
399 Event.SetUsage(self.CommonDefines.Usage)\r
400 Event.SetHelpTextList(GetHelpTextList(self.HelpText))\r
401\r
402 return Event\r
403\r
404 def ToXml(self, Event, Key):\r
405 if self.HelpText:\r
406 pass\r
407 AttributeList = [['EventType', Event.GetEventType()],\r
408 ['Usage', Event.GetUsage()],\r
409 ]\r
410 NodeList = []\r
411 for Item in Event.GetHelpTextList():\r
412 Tmp = HelpTextXml()\r
413 NodeList.append(Tmp.ToXml(Item, 'HelpText'))\r
414 Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
415\r
416 return Root\r
417\r
418 def __str__(self):\r
419 Str = "EventType = %s %s" % (self.EventType, self.CommonDefines)\r
420 for Item in self.HelpText:\r
421 Str = Str + '\n\t' + str(Item)\r
422 return Str\r
423##\r
424# HobXml\r
425#\r
426class HobXml(object):\r
427 def __init__(self):\r
428 self.HobType = ''\r
429 self.Name = ''\r
430 self.CommonDefines = CommonDefinesXml()\r
431 self.HelpText = []\r
432\r
433 def FromXml(self, Item, Key):\r
434 self.HobType = XmlAttribute(XmlNode(Item, '%s' % Key), 'HobType')\r
435 self.Name = XmlElement(Item, '%s' % Key)\r
436 self.CommonDefines.FromXml(Item, Key)\r
437 for HelpTextItem in XmlList(Item, '%s/HelpText' % Key):\r
438 HelpTextObj = HelpTextXml()\r
439 HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key)\r
440 self.HelpText.append(HelpTextObj)\r
441\r
442 Hob = HobObject()\r
443 Hob.SetHobType(self.HobType)\r
444 Hob.SetSupArchList(self.CommonDefines.SupArchList)\r
445 Hob.SetUsage(self.CommonDefines.Usage)\r
446 Hob.SetHelpTextList(GetHelpTextList(self.HelpText))\r
447\r
448 return Hob\r
449\r
450 def ToXml(self, Hob, Key):\r
451 if self.Name:\r
452 pass\r
453 AttributeList = [['HobType', Hob.GetHobType()],\r
454 ['Usage', Hob.GetUsage()],\r
455 ['SupArchList', GetStringOfList(Hob.GetSupArchList())], ]\r
456 NodeList = []\r
457 for Item in Hob.GetHelpTextList():\r
458 Tmp = HelpTextXml()\r
459 NodeList.append(Tmp.ToXml(Item, 'HelpText'))\r
460 Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
461\r
462 return Root\r
463\r
464 def __str__(self):\r
465 Str = "HobType = %s %s" % (self.HobType, self.CommonDefines)\r
466 for Item in self.HelpText:\r
467 Str = Str + '\n\t' + str(Item)\r
468 return Str\r
469\r
470##\r
471# SourceFileXml\r
472#\r
473class SourceFileXml(object):\r
474 def __init__(self):\r
475 self.SourceFile = ''\r
476 self.ToolChainFamily = ''\r
477 self.FileType = ''\r
478 self.CommonDefines = CommonDefinesXml()\r
479\r
480 def FromXml(self, Item, Key):\r
481 self.ToolChainFamily = XmlAttribute(Item, 'Family')\r
482 self.SourceFile = XmlElement(Item, 'Filename')\r
483 self.CommonDefines.FromXml(Item, Key)\r
484\r
485 self.CommonDefines.FeatureFlag = ConvertNOTEQToNE(self.CommonDefines.FeatureFlag)\r
486\r
487 SourceFile = SourceFileObject()\r
488 SourceFile.SetSourceFile(self.SourceFile)\r
489 SourceFile.SetFamily(self.ToolChainFamily)\r
490 SourceFile.SetSupArchList(self.CommonDefines.SupArchList)\r
491 SourceFile.SetFeatureFlag(self.CommonDefines.FeatureFlag)\r
492\r
493 return SourceFile\r
494\r
495 def ToXml(self, SourceFile, Key):\r
496 if self.SourceFile:\r
497 pass\r
498 FeatureFlag = ConvertNEToNOTEQ(SourceFile.GetFeatureFlag())\r
499 AttributeList = [['SupArchList', GetStringOfList(SourceFile.GetSupArchList())],\r
500 ['Family', SourceFile.GetFamily()],\r
501 ['FeatureFlag', FeatureFlag], ]\r
502 Root = CreateXmlElement('%s' % Key, SourceFile.GetSourceFile(), [], AttributeList)\r
503 return Root\r
504\r
505##\r
506# ModulePropertyXml\r
507#\r
508class ModulePropertyXml(object):\r
509 def __init__(self):\r
510 self.CommonDefines = CommonDefinesXml()\r
511 self.ModuleType = ''\r
512 self.Path = ''\r
513 self.PcdIsDriver = ''\r
514 self.UefiSpecificationVersion = ''\r
515 self.PiSpecificationVersion = ''\r
516 self.SpecificationList = []\r
517 self.SpecificationVersion = ''\r
518 self.BootModes = []\r
519 self.Events = []\r
520 self.HOBs = []\r
521\r
522 def FromXml(self, Item, Key, Header=None):\r
523 self.CommonDefines.FromXml(Item, Key)\r
524 self.ModuleType = XmlElement(Item, '%s/ModuleType' % Key)\r
525 self.Path = XmlElement(Item, '%s/Path' % Key)\r
526 self.PcdIsDriver = XmlElement(Item, '%s/PcdIsDriver' % Key)\r
527 self.UefiSpecificationVersion = XmlElement(Item, '%s/UefiSpecificationVersion' % Key)\r
528 self.PiSpecificationVersion = XmlElement(Item, '%s/PiSpecificationVersion' % Key)\r
529 for SubItem in XmlList(Item, '%s/Specification' % Key):\r
530 Specification = XmlElement(SubItem, '/Specification')\r
531 Version = XmlAttribute(XmlNode(SubItem, '/Specification'), 'Version')\r
532 self.SpecificationList.append((Specification, Version))\r
533 for SubItem in XmlList(Item, '%s/BootMode' % Key):\r
534 Axml = BootModeXml()\r
535 BootMode = Axml.FromXml(SubItem, 'BootMode')\r
536 self.BootModes.append(BootMode)\r
537 for SubItem in XmlList(Item, '%s/Event' % Key):\r
538 Axml = EventXml()\r
539 Event = Axml.FromXml(SubItem, 'Event')\r
540 self.Events.append(Event)\r
541 for SubItem in XmlList(Item, '%s/HOB' % Key):\r
542 Axml = HobXml()\r
543 Hob = Axml.FromXml(SubItem, 'HOB')\r
544 self.HOBs.append(Hob)\r
545\r
546 if Header == None:\r
547 Header = ModuleObject()\r
548\r
549 Header.SetModuleType(self.ModuleType)\r
550 Header.SetSupArchList(self.CommonDefines.SupArchList)\r
551 Header.SetModulePath(self.Path)\r
552\r
553 Header.SetPcdIsDriver(self.PcdIsDriver)\r
554 Header.SetUefiSpecificationVersion(self.UefiSpecificationVersion)\r
555 Header.SetPiSpecificationVersion(self.PiSpecificationVersion)\r
556 Header.SetSpecList(self.SpecificationList)\r
557\r
558 return Header, self.BootModes, self.Events, self.HOBs\r
559\r
560\r
561 def ToXml(self, Header, BootModes, Events, Hobs, Key):\r
562 if self.ModuleType:\r
563 pass\r
564 AttributeList = [['SupArchList', GetStringOfList(Header.GetSupArchList())], ]\r
565\r
566 NodeList = [['ModuleType', Header.GetModuleType()],\r
567 ['Path', Header.GetModulePath()],\r
568 ['PcdIsDriver', Header.GetPcdIsDriver()],\r
569 ['UefiSpecificationVersion', Header.GetUefiSpecificationVersion()],\r
570 ['PiSpecificationVersion', Header.GetPiSpecificationVersion()],\r
571 ]\r
572 for Item in Header.GetSpecList():\r
573 Spec, Version = Item\r
574 SpecElem = CreateXmlElement('Specification', Spec, [], [['Version', Version]])\r
575 NodeList.append(SpecElem)\r
576\r
577 for Item in BootModes:\r
578 Tmp = BootModeXml()\r
579 NodeList.append(Tmp.ToXml(Item, 'BootMode'))\r
580 for Item in Events:\r
581 Tmp = EventXml()\r
582 NodeList.append(Tmp.ToXml(Item, 'Event'))\r
583 for Item in Hobs:\r
584 Tmp = HobXml()\r
585 NodeList.append(Tmp.ToXml(Item, 'HOB'))\r
586 Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
587\r
588 return Root\r
589\r
590 def __str__(self):\r
591 Str = "ModuleType = %s Path = %s PcdIsDriver = %s UefiSpecificationVersion = %s PiSpecificationVersion = %s \\r
592 Specification = %s SpecificationVersion = %s %s" % \\r
593 (self.ModuleType, self.Path, self.PcdIsDriver, \\r
594 self.UefiSpecificationVersion, self.PiSpecificationVersion, \\r
595 self.SpecificationList, self.SpecificationVersion, self.CommonDefines)\r
596 for Item in self.BootModes:\r
597 Str = Str + '\n\t' + str(Item)\r
598 for Item in self.Events:\r
599 Str = Str + '\n\t' + str(Item)\r
600 for Item in self.HOBs:\r
601 Str = Str + '\n\t' + str(Item)\r
602 return Str\r
603\r
604##\r
605# ModuleXml\r
606#\r
607class ModuleSurfaceAreaXml(object):\r
608 def __init__(self, Package=''):\r
609 self.Module = None\r
610 #\r
611 # indicate the package that this module resides in\r
612 #\r
613 self.Package = Package\r
614\r
615 def FromXml2(self, Item, Module):\r
616 if self.Module:\r
617 pass\r
618 #\r
619 # PeiDepex\r
620 #\r
621 PeiDepexList = []\r
622 for SubItem in XmlList(Item, '/ModuleSurfaceArea/PeiDepex'):\r
623 Tmp = DepexXml()\r
624 Depex = Tmp.FromXml(XmlNode(SubItem, 'PeiDepex'), 'PeiDepex')\r
625 PeiDepexList.append(Depex)\r
626 Module.SetPeiDepex(PeiDepexList)\r
627\r
628 #\r
629 # DxeDepex\r
630 #\r
631 DxeDepexList = []\r
632 for SubItem in XmlList(Item, '/ModuleSurfaceArea/DxeDepex'):\r
633 Tmp = DepexXml()\r
634 Depex = Tmp.FromXml(XmlNode(SubItem, 'DxeDepex'), 'DxeDepex')\r
635 DxeDepexList.append(Depex)\r
636 Module.SetDxeDepex(DxeDepexList)\r
637\r
638 #\r
639 # SmmDepex\r
640 #\r
641 SmmDepexList = []\r
642 for SubItem in XmlList(Item, '/ModuleSurfaceArea/SmmDepex'):\r
643 Tmp = DepexXml()\r
644 Depex = Tmp.FromXml(XmlNode(SubItem, 'SmmDepex'), 'SmmDepex')\r
645 SmmDepexList.append(Depex)\r
646 Module.SetSmmDepex(SmmDepexList)\r
647\r
648 #\r
649 # MiscellaneousFile\r
650 Tmp = MiscellaneousFileXml()\r
651 MiscFileList = Tmp.FromXml(XmlNode(Item, '/ModuleSurfaceArea/MiscellaneousFiles'), 'MiscellaneousFiles')\r
652 if MiscFileList:\r
653 Module.SetMiscFileList([MiscFileList])\r
654 else:\r
655 Module.SetMiscFileList([])\r
656\r
657 # \r
658 # UserExtensions\r
659 #\r
660 for Item in XmlList(Item, '/ModuleSurfaceArea/UserExtensions'):\r
661 Tmp = UserExtensionsXml()\r
662 UserExtension = Tmp.FromXml(Item, 'UserExtensions')\r
663 Module.SetUserExtensionList(Module.GetUserExtensionList() + [UserExtension])\r
664\r
665 return Module\r
666\r
667 def FromXml(self, Item, Key, IsStandAlongModule=False):\r
668 IsBinaryModule = XmlAttribute(Item, 'BinaryModule')\r
669 #\r
670 # Header\r
671 #\r
672 Tmp = HeaderXml()\r
673 Module = Tmp.FromXml(XmlNode(Item, '/%s/Header' % Key), 'Header', True, IsStandAlongModule)\r
674 Module.SetBinaryModule(IsBinaryModule)\r
675\r
676 if IsBinaryModule:\r
677 GlobalData.gIS_BINARY_INF = True\r
678\r
679 #\r
680 # ModuleProperties\r
681 #\r
682 Tmp = ModulePropertyXml()\r
683 (Module, BootModes, Events, HOBs) = \\r
684 Tmp.FromXml(XmlNode(Item, '/ModuleSurfaceArea/ModuleProperties'), 'ModuleProperties', Module)\r
685 Module.SetBootModeList(BootModes)\r
686 Module.SetEventList(Events)\r
687 Module.SetHobList(HOBs)\r
688 #\r
689 # ClonedFrom\r
690 #\r
691 Tmp = ClonedFromXml()\r
692 ClonedFrom = Tmp.FromXml(XmlNode(Item, '/ModuleSurfaceArea/ClonedFrom'), 'ClonedFrom')\r
693 if ClonedFrom:\r
694 Module.SetClonedFrom(ClonedFrom)\r
695\r
696 #\r
697 # LibraryClass\r
698 #\r
699 for SubItem in XmlList(Item, '/ModuleSurfaceArea/LibraryClassDefinitions/LibraryClass'):\r
700 Tmp = LibraryClassXml()\r
701 LibraryClass = Tmp.FromXml(SubItem, 'LibraryClass')\r
702 Module.SetLibraryClassList(Module.GetLibraryClassList() + [LibraryClass])\r
703\r
704 if XmlList(Item, '/ModuleSurfaceArea/LibraryClassDefinitions') and \\r
705 not XmlList(Item, '/ModuleSurfaceArea/LibraryClassDefinitions/LibraryClass'):\r
706 Module.SetLibraryClassList([None])\r
707\r
708 #\r
709 # SourceFiles\r
710 #\r
711 for SubItem in XmlList(Item, '/ModuleSurfaceArea/SourceFiles/Filename'):\r
712 Tmp = SourceFileXml()\r
713 SourceFile = Tmp.FromXml(SubItem, 'Filename')\r
714 Module.SetSourceFileList(Module.GetSourceFileList() + [SourceFile])\r
715\r
716 if XmlList(Item, '/ModuleSurfaceArea/SourceFiles') and \\r
717 not XmlList(Item, '/ModuleSurfaceArea/SourceFiles/Filename') :\r
718 Module.SetSourceFileList([None])\r
719\r
720 #\r
721 # BinaryFile\r
722 #\r
723 for SubItem in XmlList(Item, '/ModuleSurfaceArea/BinaryFiles/BinaryFile'):\r
724 Tmp = BinaryFileXml()\r
725 BinaryFile = Tmp.FromXml(SubItem, 'BinaryFile')\r
726 Module.SetBinaryFileList(Module.GetBinaryFileList() + [BinaryFile])\r
727\r
728 if XmlList(Item, '/ModuleSurfaceArea/BinaryFiles') and \\r
729 not XmlList(Item, '/ModuleSurfaceArea/BinaryFiles/BinaryFile') :\r
730 Module.SetBinaryFileList([None])\r
731 #\r
732 # PackageDependencies\r
733 #\r
734 for SubItem in XmlList(Item, '/ModuleSurfaceArea/PackageDependencies/Package'):\r
735 Tmp = PackageXml()\r
736 PackageDependency = Tmp.FromXml(SubItem, 'Package')\r
737 Module.SetPackageDependencyList(Module.GetPackageDependencyList() + [PackageDependency])\r
738\r
739 if XmlList(Item, '/ModuleSurfaceArea/PackageDependencies') and \\r
740 not XmlList(Item, '/ModuleSurfaceArea/PackageDependencies/Package'):\r
741 Module.SetPackageDependencyList([None])\r
742\r
743 # \r
744 # Guid\r
745 #\r
746 for SubItem in XmlList(Item, '/ModuleSurfaceArea/Guids/GuidCName'):\r
747 Tmp = GuidXml('Module')\r
748 GuidProtocolPpi = Tmp.FromXml(SubItem, 'GuidCName')\r
749 Module.SetGuidList(Module.GetGuidList() + [GuidProtocolPpi])\r
750\r
751 if XmlList(Item, '/ModuleSurfaceArea/Guids') and not XmlList(Item, '/ModuleSurfaceArea/Guids/GuidCName'):\r
752 Module.SetGuidList([None])\r
753\r
754 #\r
755 # Protocol\r
756 #\r
757 for SubItem in XmlList(Item, '/ModuleSurfaceArea/Protocols/Protocol'):\r
758 Tmp = ProtocolXml('Module')\r
759 GuidProtocolPpi = Tmp.FromXml(SubItem, 'Protocol')\r
760 Module.SetProtocolList(Module.GetProtocolList() + [GuidProtocolPpi])\r
761\r
762 if XmlList(Item, '/ModuleSurfaceArea/Protocols') and not XmlList(Item, '/ModuleSurfaceArea/Protocols/Protocol'):\r
763 Module.SetProtocolList([None])\r
764\r
765 #\r
766 # Ppi\r
767 #\r
768 for SubItem in XmlList(Item, '/ModuleSurfaceArea/PPIs/Ppi'):\r
769 Tmp = PpiXml('Module')\r
770 GuidProtocolPpi = Tmp.FromXml(SubItem, 'Ppi')\r
771 Module.SetPpiList(Module.GetPpiList() + [GuidProtocolPpi])\r
772\r
773 if XmlList(Item, '/ModuleSurfaceArea/PPIs') and not XmlList(Item, '/ModuleSurfaceArea/PPIs/Ppi'):\r
774 Module.SetPpiList([None])\r
775\r
776 #\r
777 # Extern\r
778 #\r
779 for SubItem in XmlList(Item, '/ModuleSurfaceArea/Externs/Extern'):\r
780 Tmp = ExternXml()\r
781 Extern = Tmp.FromXml(SubItem, 'Extern')\r
782 Module.SetExternList(Module.GetExternList() + [Extern])\r
783\r
784 if XmlList(Item, '/ModuleSurfaceArea/Externs') and not XmlList(Item, '/ModuleSurfaceArea/Externs/Extern'):\r
785 Module.SetExternList([None])\r
786\r
787 if not Module.GetBinaryModule():\r
788 #\r
789 # PcdCoded\r
790 #\r
791 for SubItem in XmlList(Item, '/ModuleSurfaceArea/PcdCoded/PcdEntry'):\r
792 Tmp = PcdEntryXml()\r
793 PcdEntry = Tmp.FromXml3(SubItem, 'PcdEntry')\r
794 Module.SetPcdList(Module.GetPcdList() + [PcdEntry])\r
795\r
796 if XmlList(Item, '/ModuleSurfaceArea/PcdCoded') and \\r
797 not XmlList(Item, '/ModuleSurfaceArea/PcdCoded/PcdEntry'):\r
798 Module.SetPcdList([None])\r
799\r
800 Module = self.FromXml2(Item, Module)\r
801 #\r
802 # return the module object\r
803 #\r
804 self.Module = Module\r
805 return self.Module\r
806\r
807 def ToXml(self, Module):\r
808 if self.Package:\r
809 pass\r
810 #\r
811 # Create root node of module surface area\r
812 #\r
813 DomModule = minidom.Document().createElement('ModuleSurfaceArea')\r
814 if Module.GetBinaryModule():\r
815 DomModule.setAttribute('BinaryModule', 'true')\r
816\r
817 #\r
818 # Header\r
819 #\r
820 Tmp = HeaderXml()\r
821 DomModule.appendChild(Tmp.ToXml(Module, 'Header'))\r
822 #\r
823 # ModuleProperties\r
824 #\r
825 Tmp = ModulePropertyXml()\r
826 DomModule.appendChild(Tmp.ToXml(Module, Module.GetBootModeList(), Module.GetEventList(), Module.GetHobList(), \\r
827 'ModuleProperties'))\r
828 #\r
829 # ClonedFrom\r
830 #\r
831 Tmp = ClonedFromXml()\r
832 if Module.GetClonedFrom():\r
833 DomModule.appendChild(Tmp.ToXml(Module.GetClonedFrom(), 'ClonedFrom'))\r
834 #\r
835 # LibraryClass\r
836 #\r
837 LibraryClassNode = CreateXmlElement('LibraryClassDefinitions', '', [], [])\r
838 for LibraryClass in Module.GetLibraryClassList():\r
839 Tmp = LibraryClassXml()\r
840 LibraryClassNode.appendChild(Tmp.ToXml2(LibraryClass, 'LibraryClass'))\r
841 DomModule.appendChild(LibraryClassNode)\r
842 #\r
843 # SourceFile\r
844 #\r
845 SourceFileNode = CreateXmlElement('SourceFiles', '', [], [])\r
846 for SourceFile in Module.GetSourceFileList():\r
847 Tmp = SourceFileXml()\r
848 SourceFileNode.appendChild(Tmp.ToXml(SourceFile, 'Filename'))\r
849 DomModule.appendChild(SourceFileNode)\r
850 #\r
851 # BinaryFile\r
852 #\r
853 BinaryFileNode = CreateXmlElement('BinaryFiles', '', [], [])\r
854 for BinaryFile in Module.GetBinaryFileList():\r
855 Tmp = BinaryFileXml()\r
856 BinaryFileNode.appendChild(Tmp.ToXml(BinaryFile, 'BinaryFile'))\r
857 DomModule.appendChild(BinaryFileNode)\r
858 #\r
859 # PackageDependencies\r
860 #\r
861 PackageDependencyNode = CreateXmlElement('PackageDependencies', '', [], [])\r
862 for PackageDependency in Module.GetPackageDependencyList():\r
863 Tmp = PackageXml()\r
864 PackageDependencyNode.appendChild(Tmp.ToXml(PackageDependency, 'Package'))\r
865 DomModule.appendChild(PackageDependencyNode)\r
866\r
867 #\r
868 # Guid\r
869 #\r
870 GuidProtocolPpiNode = CreateXmlElement('Guids', '', [], [])\r
871 for GuidProtocolPpi in Module.GetGuidList():\r
872 Tmp = GuidXml('Module')\r
873 GuidProtocolPpiNode.appendChild(Tmp.ToXml(GuidProtocolPpi, 'GuidCName'))\r
874 DomModule.appendChild(GuidProtocolPpiNode)\r
875\r
876 #\r
877 # Protocol\r
878 #\r
879 GuidProtocolPpiNode = CreateXmlElement('Protocols', '', [], [])\r
880 for GuidProtocolPpi in Module.GetProtocolList():\r
881 Tmp = ProtocolXml('Module')\r
882 GuidProtocolPpiNode.appendChild(Tmp.ToXml(GuidProtocolPpi, 'Protocol'))\r
883 DomModule.appendChild(GuidProtocolPpiNode)\r
884\r
885 #\r
886 # Ppi\r
887 #\r
888 GuidProtocolPpiNode = CreateXmlElement('PPIs', '', [], [])\r
889 for GuidProtocolPpi in Module.GetPpiList():\r
890 Tmp = PpiXml('Module')\r
891 GuidProtocolPpiNode.appendChild(Tmp.ToXml(GuidProtocolPpi, 'Ppi'))\r
892 DomModule.appendChild(GuidProtocolPpiNode)\r
893 #\r
894 # Extern\r
895 #\r
896 ExternNode = CreateXmlElement('Externs', '', [], [])\r
897 for Extern in Module.GetExternList():\r
898 Tmp = ExternXml()\r
899 ExternNode.appendChild(Tmp.ToXml(Extern, 'Extern'))\r
900 DomModule.appendChild(ExternNode)\r
901 #\r
902 # PcdCoded\r
903 #\r
904 PcdEntryNode = CreateXmlElement('PcdCoded', '', [], [])\r
905 for PcdEntry in Module.GetPcdList():\r
906 Tmp = PcdEntryXml()\r
907 PcdEntryNode.appendChild(Tmp.ToXml3(PcdEntry, 'PcdEntry'))\r
908 DomModule.appendChild(PcdEntryNode)\r
909\r
910 #\r
911 # PeiDepex\r
912 #\r
913 if Module.GetPeiDepex():\r
914 for Item in Module.GetPeiDepex():\r
915 Tmp = DepexXml()\r
916 DomModule.appendChild(Tmp.ToXml(Item, 'PeiDepex'))\r
917\r
918 #\r
919 # DxeDepex\r
920 #\r
921 if Module.GetDxeDepex():\r
922 for Item in Module.GetDxeDepex():\r
923 Tmp = DepexXml()\r
924 DomModule.appendChild(Tmp.ToXml(Item, 'DxeDepex'))\r
925\r
926 #\r
927 # SmmDepex\r
928 #\r
929 if Module.GetSmmDepex():\r
930 for Item in Module.GetSmmDepex():\r
931 Tmp = DepexXml()\r
932 DomModule.appendChild(Tmp.ToXml(Item, 'SmmDepex'))\r
933\r
934 #\r
935 # MiscellaneousFile\r
936 #\r
937 if Module.GetMiscFileList():\r
938 Tmp = MiscellaneousFileXml()\r
939 DomModule.appendChild(Tmp.ToXml(Module.GetMiscFileList()[0], 'MiscellaneousFiles'))\r
940 #\r
941 # UserExtensions\r
942 #\r
943 if Module.GetUserExtensionList():\r
944 for UserExtension in Module.GetUserExtensionList():\r
945 Tmp = UserExtensionsXml()\r
946 DomModule.appendChild(Tmp.ToXml(UserExtension, 'UserExtensions'))\r
947\r
948 return DomModule\r
949\r
950##\r
951# BuildFlagXml used to generate BuildFlag for <AsBuilt>\r
952#\r
953class BuildFlagXml(object):\r
954 def __init__(self):\r
955 self.Target = ''\r
956 self.TagName = ''\r
957 self.Family = ''\r
958 self.AsBuiltFlags = ''\r
959\r
960 def FromXml(self, Item, Key):\r
961 self.Target = XmlElement(Item, '%s/Target' % Key)\r
962 self.TagName = XmlElement(Item, '%s/TagName' % Key)\r
963 self.Family = XmlElement(Item, '%s/Family' % Key)\r
964\r
965 BuildFlag = BinaryBuildFlagObject()\r
966\r
967 BuildFlag.SetTarget(self.Target)\r
968 BuildFlag.SetTagName(self.TagName)\r
969 BuildFlag.SetFamily(self.Family)\r
970\r
971 return BuildFlag\r
972\r
973 #\r
974 # For AsBuild INF usage\r
975 #\r
976 def FromXml2(self, Item, Key):\r
977 self.AsBuiltFlags = XmlElement(Item, '%s' % Key)\r
978\r
979 LineList = GetSplitValueList(self.AsBuiltFlags, '\n')\r
980 ReturnLine = ''\r
981 Count = 0\r
982 for Line in LineList:\r
983 if Count == 0:\r
984 ReturnLine = "# " + Line\r
985 else:\r
986 ReturnLine = ReturnLine + '\n' + '# ' + Line\r
987 Count += 1\r
988\r
989 BuildFlag = BinaryBuildFlagObject()\r
990 BuildFlag.SetAsBuiltOptionFlags(ReturnLine)\r
991\r
992 return BuildFlag\r
993\r
994 def ToXml(self, BuildFlag, Key):\r
995 if self.Target:\r
996 pass\r
997 AttributeList = []\r
998 NodeList = []\r
999 NodeList.append(['BuildFlags', BuildFlag])\r
1000\r
1001 Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
1002 return Root\r