]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/UPT/Xml/ModuleSurfaceAreaXml.py
Sync BaseTools Branch (version r2271) to EDKII main trunk.
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Xml / ModuleSurfaceAreaXml.py
diff --git a/BaseTools/Source/Python/UPT/Xml/ModuleSurfaceAreaXml.py b/BaseTools/Source/Python/UPT/Xml/ModuleSurfaceAreaXml.py
new file mode 100644 (file)
index 0000000..a913a85
--- /dev/null
@@ -0,0 +1,997 @@
+## @file\r
+# This file is used to parse a Module file of .PKG file\r
+#\r
+# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+#\r
+# This program and the accompanying materials are licensed and made available \r
+# under the terms and conditions of the BSD License which accompanies this \r
+# distribution. The full text of the license may be found at \r
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+\r
+'''\r
+ModuleSurfaceAreaXml\r
+'''\r
+from xml.dom import minidom\r
+\r
+from Library.String import ConvertNEToNOTEQ\r
+from Library.String import ConvertNOTEQToNE\r
+from Library.String import GetStringOfList\r
+from Library.Xml.XmlRoutines import XmlElement\r
+from Library.Xml.XmlRoutines import XmlAttribute\r
+from Library.Xml.XmlRoutines import XmlNode\r
+from Library.Xml.XmlRoutines import XmlList\r
+from Library.Xml.XmlRoutines import CreateXmlElement\r
+from Object.POM.CommonObject import GuidVersionObject\r
+from Object.POM.ModuleObject import BootModeObject\r
+from Object.POM.ModuleObject import DepexObject\r
+from Object.POM.ModuleObject import ModuleObject\r
+from Object.POM.ModuleObject import EventObject\r
+from Object.POM.ModuleObject import HobObject\r
+from Object.POM.ModuleObject import SourceFileObject\r
+from Object.POM.ModuleObject import PackageDependencyObject\r
+from Object.POM.ModuleObject import ExternObject\r
+from Object.POM.ModuleObject import BinaryFileObject\r
+from Object.POM.ModuleObject import AsBuiltObject\r
+from Object.POM.ModuleObject import BinaryBuildFlagObject\r
+from Xml.CommonXml import ClonedFromXml\r
+from Xml.CommonXml import HeaderXml\r
+from Xml.CommonXml import HelpTextXml\r
+from Xml.CommonXml import CommonDefinesXml\r
+from Xml.CommonXml import LibraryClassXml\r
+from Xml.CommonXml import UserExtensionsXml\r
+from Xml.CommonXml import MiscellaneousFileXml\r
+from Xml.CommonXml import FilenameXml\r
+from Xml.GuidProtocolPpiXml import GuidXml\r
+from Xml.GuidProtocolPpiXml import ProtocolXml\r
+from Xml.GuidProtocolPpiXml import PpiXml\r
+from Xml.PcdXml import PcdEntryXml\r
+from Xml.XmlParserMisc import GetHelpTextList\r
+from Library import GlobalData\r
+from Library.Misc import GetSplitValueList\r
+\r
+##   BinaryFileXml\r
+#\r
+#    represent the following XML item\r
+#\r
+#    <BinaryFile>\r
+#    <Filename\r
+#    FileType=" FileType " {1}\r
+#    SupArchList=" ArchListType " {0,1}\r
+#    FeatureFlag=" FeatureFlagExpression " {0,1} >\r
+#    xs:anyURI\r
+#    </Filename> {1,}\r
+#    <AsBuilt> ... </AsBuilt> {0,}\r
+#    </BinaryFile> {1,}\r
+#    \r
+class BinaryFileXml(object):\r
+    def __init__(self):\r
+        self.FileNames = []\r
+        self.AsBuiltList = []\r
+        self.PatchPcdValues = ''\r
+        self.PcdExValues = ''\r
+        self.LibraryInstances = ''\r
+        self.BuildFlags = ''\r
+\r
+    def FromXml(self, Item, Key):\r
+        if self.FileNames:\r
+            pass\r
+        BinaryFile = BinaryFileObject()\r
+        FilenameList = []\r
+        for SubItem in XmlList(Item, '%s/Filename' % Key):\r
+            Axml = FilenameXml()\r
+            Bxml = Axml.FromXml(SubItem, 'Filename')\r
+            FilenameList.append(Bxml)\r
+        BinaryFile.SetFileNameList(FilenameList)\r
+        if GlobalData.gIS_BINARY_INF:\r
+            AsBuiltList = []\r
+            for AsBuiltItem in XmlList(Item, '%s/AsBuilt' % Key):\r
+                AsBuilt = AsBuiltObject()\r
+\r
+                PatchPcdValueList = []\r
+                for SubItem in XmlList(AsBuiltItem, 'AsBuilt/PatchPcdValue'):\r
+                    Axml = PcdEntryXml()\r
+                    Bxml = Axml.FromXml(SubItem, 'PatchPcdValue')\r
+                    PatchPcdValueList.append(Bxml)\r
+                AsBuilt.SetPatchPcdList(PatchPcdValueList)\r
+                PcdExValueList = []\r
+                for SubItem in XmlList(AsBuiltItem, 'AsBuilt/PcdExValue'):\r
+                    Axml = PcdEntryXml()\r
+                    Bxml = Axml.FromXml(SubItem, 'PcdExValue')\r
+                    PcdExValueList.append(Bxml)\r
+                AsBuilt.SetPcdExList(PcdExValueList)\r
+                LibraryList = []\r
+                for SubItem in XmlList(Item, '%s/AsBuilt/LibraryInstances/GUID' % Key):\r
+                    GuidVerObj = GuidVersionObject()\r
+                    GUID = XmlElement(SubItem, 'GUID')\r
+                    Version = XmlAttribute(XmlNode(SubItem, 'GUID'), 'Version')\r
+                    GuidVerObj.SetGuid(GUID)\r
+                    GuidVerObj.SetVersion(Version)\r
+                    LibraryList.append(GuidVerObj)\r
+                if XmlList(Item, '%s/AsBuilt/LibraryInstances' % Key) and not LibraryList:\r
+                    LibraryList = [None]\r
+                AsBuilt.SetLibraryInstancesList(LibraryList)\r
+                BuildFlagList = []\r
+                for SubItem in XmlList(Item, '%s/AsBuilt/BuildFlags' % Key):\r
+                    BuildFlag = BuildFlagXml()\r
+                    BuildFlagList.append(BuildFlag.FromXml2(SubItem, 'BuildFlags'))\r
+                AsBuilt.SetBuildFlagsList(BuildFlagList)\r
+                AsBuiltList.append(AsBuilt)\r
+            BinaryFile.SetAsBuiltList(AsBuiltList)\r
+        return BinaryFile\r
+\r
+    def ToXml(self, BinaryFile, Key):\r
+        if self.FileNames:\r
+            pass\r
+        NodeList = []\r
+        FilenameList = BinaryFile.GetFileNameList()\r
+        for Filename in FilenameList:\r
+            Tmp = FilenameXml()\r
+            NodeList.append(Tmp.ToXml(Filename, 'Filename'))\r
+\r
+        if GlobalData.gIS_BINARY_INF:\r
+            AsBuildList = BinaryFile.GetAsBuiltList()\r
+            PatchPcdValueList = AsBuildList.GetPatchPcdList()\r
+            PcdExList = AsBuildList.GetPcdExList()\r
+            LibGuidVerList = AsBuildList.GetLibraryInstancesList()\r
+            BuildFlagList = AsBuildList.GetBuildFlagsList()\r
+\r
+            AsBuiltNodeList = []\r
+\r
+            for Pcd in PatchPcdValueList:\r
+                Tmp = PcdEntryXml()\r
+                AsBuiltNodeList.append(Tmp.ToXml4(Pcd, 'PatchPcdValue'))\r
+\r
+            for Pcd in PcdExList:\r
+                Tmp = PcdEntryXml()\r
+                AsBuiltNodeList.append(Tmp.ToXml4(Pcd, 'PcdExValue'))\r
+\r
+            GuiVerElemList = []\r
+            for LibGuidVer in LibGuidVerList:\r
+                GuiVerElem = \\r
+                CreateXmlElement('GUID', LibGuidVer.GetLibGuid(), [], [['Version', LibGuidVer.GetLibVersion()]])\r
+                GuiVerElemList.append(GuiVerElem)\r
+            if len(GuiVerElemList) > 0:\r
+                LibGuidVerElem = CreateXmlElement('LibraryInstances', '', GuiVerElemList, [])\r
+                AsBuiltNodeList.append(LibGuidVerElem)\r
+\r
+            for BuildFlag in BuildFlagList:\r
+                Tmp = BuildFlagXml()\r
+                Elem = CreateXmlElement('BuildFlags', ''.join(BuildFlag), [], [])\r
+                AsBuiltNodeList.append(Elem)\r
+\r
+            if len(AsBuiltNodeList) > 0:\r
+                Element = CreateXmlElement('AsBuilt', '', AsBuiltNodeList, [])\r
+                NodeList.append(Element)\r
+\r
+        Root = CreateXmlElement('%s' % Key, '', NodeList, [])\r
+\r
+        return Root\r
+\r
+    def __str__(self):\r
+        Str = "BinaryFiles:"\r
+        for Item in self.FileNames:\r
+            Str = Str + '\n\t' + str(Item)\r
+        for Item in self.PatchPcdValues:\r
+            Str = Str + '\n\t' + str(Item)\r
+        for Item in self.PcdExValues:\r
+            Str = Str + '\n\t' + str(Item)\r
+        for Item in self.LibraryInstances:\r
+            Str = Str + '\n\t' + str(Item)\r
+        for Item in self.BuildFlags:\r
+            Str = Str + '\n\t' + str(Item)\r
+        return Str\r
+\r
+##\r
+# PackageXml\r
+#\r
+class PackageXml(object):\r
+    def __init__(self):\r
+        self.Description = ''\r
+        self.Guid = ''\r
+        self.Version = ''\r
+        self.CommonDefines = CommonDefinesXml()\r
+\r
+    def FromXml(self, Item, Key):\r
+        self.Description = XmlElement(Item, '%s/Description' % Key)\r
+        self.Guid = XmlElement(Item, '%s/GUID' % Key)\r
+        self.Version = XmlAttribute(XmlNode(Item, '%s/GUID' % Key), 'Version')\r
+        self.CommonDefines.FromXml(XmlNode(Item, '%s' % Key), Key)\r
+\r
+        PackageDependency = PackageDependencyObject()\r
+        PackageDependency.SetPackage(self.Description)\r
+        PackageDependency.SetGuid(self.Guid)\r
+        PackageDependency.SetVersion(self.Version)\r
+        PackageDependency.SetFeatureFlag(ConvertNOTEQToNE(self.CommonDefines.FeatureFlag))\r
+        PackageDependency.SetSupArchList(self.CommonDefines.SupArchList)\r
+\r
+        return PackageDependency\r
+\r
+    def ToXml(self, PackageDependency, Key):\r
+        if self.Guid:\r
+            pass\r
+        AttributeList = [['SupArchList', GetStringOfList(PackageDependency.GetSupArchList())],\r
+                         ['FeatureFlag', ConvertNEToNOTEQ(PackageDependency.GetFeatureFlag())], ]\r
+        Element1 = CreateXmlElement('GUID', PackageDependency.GetGuid(), [],\r
+                                    [['Version', PackageDependency.GetVersion()]])\r
+        NodeList = [['Description', PackageDependency.GetPackage()], Element1, ]\r
+        Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
+\r
+        return Root\r
+\r
+    def __str__(self):\r
+        Str = "Description = %s Guid = %s Version = %s %s" \\r
+              % (self.Description, self.Guid, self.Version, self.CommonDefines)\r
+        return Str\r
+##\r
+# ExternXml\r
+#\r
+class ExternXml(object):\r
+    def __init__(self):\r
+        self.CommonDefines = CommonDefinesXml()\r
+        self.EntryPoint = ''\r
+        self.UnloadImage = ''\r
+        self.Constructor = ''\r
+        self.Destructor = ''\r
+        self.SupModList = ''\r
+        self.SupArchList = ''\r
+        self.HelpText = []\r
+\r
+    def FromXml(self, Item, Key):\r
+        self.CommonDefines.FromXml(Item, Key)\r
+        self.EntryPoint = XmlElement(Item, '%s/EntryPoint' % Key)\r
+        self.UnloadImage = XmlElement(Item, '%s/UnloadImage' % Key)\r
+        self.Constructor = XmlElement(Item, '%s/Constructor' % Key)\r
+        self.Destructor = XmlElement(Item, '%s/Destructor' % Key)\r
+\r
+        Extern = ExternObject()\r
+        Extern.SetEntryPoint(self.EntryPoint)\r
+        Extern.SetUnloadImage(self.UnloadImage)\r
+        Extern.SetConstructor(self.Constructor)\r
+        Extern.SetDestructor(self.Destructor)\r
+        if self.CommonDefines.SupModList:\r
+            Extern.SetSupModList(self.CommonDefines.SupModList)\r
+        if self.CommonDefines.SupArchList:\r
+            Extern.SetSupArchList(self.CommonDefines.SupArchList)\r
+        return Extern\r
+\r
+    def ToXml(self, Extern, Key):\r
+        if self.HelpText:\r
+            pass\r
+\r
+        NodeList = []\r
+        if Extern.GetEntryPoint():\r
+            NodeList.append(['EntryPoint', Extern.GetEntryPoint()])\r
+        if Extern.GetUnloadImage():\r
+            NodeList.append(['UnloadImage', Extern.GetUnloadImage()])\r
+        if Extern.GetConstructor():\r
+            NodeList.append(['Constructor', Extern.GetConstructor()])\r
+        if Extern.GetDestructor():\r
+            NodeList.append(['Destructor', Extern.GetDestructor()])\r
+        Root = CreateXmlElement('%s' % Key, '', NodeList, [])\r
+\r
+        return Root\r
+\r
+    def __str__(self):\r
+        Str = "EntryPoint = %s UnloadImage = %s Constructor = %s Destructor = %s %s" \\r
+              % (self.EntryPoint, self.UnloadImage, self.Constructor, self.Destructor, self.CommonDefines)\r
+        for Item in self.HelpText:\r
+            Str = Str + '\n\t' + str(Item)\r
+        return Str\r
+##    \r
+# DepexXml\r
+#\r
+class DepexXml(object):\r
+    def __init__(self):\r
+        self.CommonDefines = CommonDefinesXml()\r
+        self.Expression = None\r
+        self.HelpText = []\r
+\r
+    def FromXml(self, Item, Key):\r
+        if not Item:\r
+            return None\r
+        self.CommonDefines.FromXml(Item, Key)\r
+        self.Expression = XmlElement(Item, '%s/Expression' % Key)\r
+        for HelpTextItem in XmlList(Item, '%s/HelpText' % Key):\r
+            HelpTextObj = HelpTextXml()\r
+            HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key)\r
+            self.HelpText.append(HelpTextObj)\r
+\r
+        Depex = DepexObject()\r
+        Depex.SetDepex(self.Expression)\r
+        Depex.SetModuleType(self.CommonDefines.SupModList)\r
+        Depex.SetSupArchList(self.CommonDefines.SupArchList)\r
+        Depex.SetFeatureFlag(self.CommonDefines.FeatureFlag)\r
+        Depex.SetHelpTextList(GetHelpTextList(self.HelpText))\r
+\r
+        return Depex\r
+\r
+    def ToXml(self, Depex, Key):\r
+        if self.HelpText:\r
+            pass\r
+        AttributeList = [['SupArchList', GetStringOfList(Depex.GetSupArchList())],\r
+                         ['SupModList', Depex.GetModuleType()]]\r
+        NodeList = [['Expression', Depex.GetDepex()]]\r
+        if Depex.GetHelpText():\r
+            Tmp = HelpTextXml()\r
+            NodeList.append(Tmp.ToXml(Depex.GetHelpText(), 'HelpText'))\r
+\r
+        Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
+        return Root\r
+\r
+    def __str__(self):\r
+        Str = "Expression = %s" % (self.Expression)\r
+        for Item in self.HelpText:\r
+            Str = Str + '\n\t' + str(Item)\r
+        return Str\r
+\r
+##\r
+# BootModeXml\r
+#\r
+class BootModeXml(object):\r
+    def __init__(self):\r
+        self.SupportedBootModes = ''\r
+        self.CommonDefines = CommonDefinesXml()\r
+        self.HelpText = []\r
+\r
+    def FromXml(self, Item, Key):\r
+        self.SupportedBootModes = \\r
+        XmlElement(Item, '%s/SupportedBootModes' % Key)\r
+        self.CommonDefines.FromXml(Item, Key)\r
+        for HelpTextItem in XmlList(Item, '%s/HelpText' % Key):\r
+            HelpTextObj = HelpTextXml()\r
+            HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key)\r
+            self.HelpText.append(HelpTextObj)\r
+\r
+        BootMode = BootModeObject()\r
+        BootMode.SetSupportedBootModes(self.SupportedBootModes)\r
+        BootMode.SetUsage(self.CommonDefines.Usage)\r
+        BootMode.SetHelpTextList(GetHelpTextList(self.HelpText))\r
+\r
+        return BootMode\r
+\r
+    def ToXml(self, BootMode, Key):\r
+        if self.HelpText:\r
+            pass\r
+        AttributeList = [['Usage', BootMode.GetUsage()], ]\r
+        NodeList = [['SupportedBootModes', BootMode.GetSupportedBootModes()]]\r
+        for Item in BootMode.GetHelpTextList():\r
+            Tmp = HelpTextXml()\r
+            NodeList.append(Tmp.ToXml(Item, 'HelpText'))\r
+        Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
+\r
+        return Root\r
+\r
+    def __str__(self):\r
+        Str = "SupportedBootModes = %s %s" % (self.SupportedBootModes, self.CommonDefines)\r
+        for Item in self.HelpText:\r
+            Str = Str + '\n\t' + str(Item)\r
+        return Str\r
+##\r
+# EventXml\r
+#\r
+class EventXml(object):\r
+    def __init__(self):\r
+        self.EventType = ''\r
+        self.Name = ''\r
+        self.CommonDefines = CommonDefinesXml()\r
+        self.HelpText = []\r
+\r
+    def FromXml(self, Item, Key):\r
+        self.EventType = XmlAttribute(XmlNode(Item, '%s' % Key), 'EventType')\r
+        self.Name = XmlElement(Item, '%s' % Key)\r
+        self.CommonDefines.FromXml(Item, Key)\r
+        for HelpTextItem in XmlList(Item, '%s/HelpText' % Key):\r
+            HelpTextObj = HelpTextXml()\r
+            HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key)\r
+            self.HelpText.append(HelpTextObj)\r
+\r
+        Event = EventObject()\r
+        Event.SetEventType(self.EventType)\r
+        Event.SetUsage(self.CommonDefines.Usage)\r
+        Event.SetHelpTextList(GetHelpTextList(self.HelpText))\r
+\r
+        return Event\r
+\r
+    def ToXml(self, Event, Key):\r
+        if self.HelpText:\r
+            pass\r
+        AttributeList = [['EventType', Event.GetEventType()],\r
+                         ['Usage', Event.GetUsage()],\r
+                        ]\r
+        NodeList = []\r
+        for Item in Event.GetHelpTextList():\r
+            Tmp = HelpTextXml()\r
+            NodeList.append(Tmp.ToXml(Item, 'HelpText'))\r
+        Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
+\r
+        return Root\r
+\r
+    def __str__(self):\r
+        Str = "EventType = %s %s" % (self.EventType, self.CommonDefines)\r
+        for Item in self.HelpText:\r
+            Str = Str + '\n\t' + str(Item)\r
+        return Str\r
+##\r
+# HobXml\r
+#\r
+class HobXml(object):\r
+    def __init__(self):\r
+        self.HobType = ''\r
+        self.Name = ''\r
+        self.CommonDefines = CommonDefinesXml()\r
+        self.HelpText = []\r
+\r
+    def FromXml(self, Item, Key):\r
+        self.HobType = XmlAttribute(XmlNode(Item, '%s' % Key), 'HobType')\r
+        self.Name = XmlElement(Item, '%s' % Key)\r
+        self.CommonDefines.FromXml(Item, Key)\r
+        for HelpTextItem in XmlList(Item, '%s/HelpText' % Key):\r
+            HelpTextObj = HelpTextXml()\r
+            HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key)\r
+            self.HelpText.append(HelpTextObj)\r
+\r
+        Hob = HobObject()\r
+        Hob.SetHobType(self.HobType)\r
+        Hob.SetSupArchList(self.CommonDefines.SupArchList)\r
+        Hob.SetUsage(self.CommonDefines.Usage)\r
+        Hob.SetHelpTextList(GetHelpTextList(self.HelpText))\r
+\r
+        return Hob\r
+\r
+    def ToXml(self, Hob, Key):\r
+        if self.Name:\r
+            pass\r
+        AttributeList = [['HobType', Hob.GetHobType()],\r
+                         ['Usage', Hob.GetUsage()],\r
+                         ['SupArchList', GetStringOfList(Hob.GetSupArchList())], ]\r
+        NodeList = []\r
+        for Item in Hob.GetHelpTextList():\r
+            Tmp = HelpTextXml()\r
+            NodeList.append(Tmp.ToXml(Item, 'HelpText'))\r
+        Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
+\r
+        return Root\r
+\r
+    def __str__(self):\r
+        Str = "HobType = %s %s" % (self.HobType, self.CommonDefines)\r
+        for Item in self.HelpText:\r
+            Str = Str + '\n\t' + str(Item)\r
+        return Str\r
+\r
+##\r
+# SourceFileXml\r
+#\r
+class SourceFileXml(object):\r
+    def __init__(self):\r
+        self.SourceFile = ''\r
+        self.ToolChainFamily = ''\r
+        self.FileType = ''\r
+        self.CommonDefines = CommonDefinesXml()\r
+\r
+    def FromXml(self, Item, Key):\r
+        self.ToolChainFamily = XmlAttribute(Item, 'Family')\r
+        self.SourceFile = XmlElement(Item, 'Filename')\r
+        self.CommonDefines.FromXml(Item, Key)\r
+\r
+        self.CommonDefines.FeatureFlag = ConvertNOTEQToNE(self.CommonDefines.FeatureFlag)\r
+\r
+        SourceFile = SourceFileObject()\r
+        SourceFile.SetSourceFile(self.SourceFile)\r
+        SourceFile.SetFamily(self.ToolChainFamily)\r
+        SourceFile.SetSupArchList(self.CommonDefines.SupArchList)\r
+        SourceFile.SetFeatureFlag(self.CommonDefines.FeatureFlag)\r
+\r
+        return SourceFile\r
+\r
+    def ToXml(self, SourceFile, Key):\r
+        if self.SourceFile:\r
+            pass\r
+        FeatureFlag = ConvertNEToNOTEQ(SourceFile.GetFeatureFlag())\r
+        AttributeList = [['SupArchList', GetStringOfList(SourceFile.GetSupArchList())],\r
+                         ['Family', SourceFile.GetFamily()],\r
+                         ['FeatureFlag', FeatureFlag], ]\r
+        Root = CreateXmlElement('%s' % Key, SourceFile.GetSourceFile(), [], AttributeList)\r
+        return Root\r
+\r
+##\r
+# ModulePropertyXml\r
+#\r
+class ModulePropertyXml(object):\r
+    def __init__(self):\r
+        self.CommonDefines = CommonDefinesXml()\r
+        self.ModuleType = ''\r
+        self.Path = ''\r
+        self.PcdIsDriver = ''\r
+        self.UefiSpecificationVersion = ''\r
+        self.PiSpecificationVersion = ''\r
+        self.SpecificationList = []\r
+        self.SpecificationVersion = ''\r
+        self.BootModes = []\r
+        self.Events = []\r
+        self.HOBs = []\r
+\r
+    def FromXml(self, Item, Key, Header=None):\r
+        self.CommonDefines.FromXml(Item, Key)\r
+        self.ModuleType = XmlElement(Item, '%s/ModuleType' % Key)\r
+        self.Path = XmlElement(Item, '%s/Path' % Key)\r
+        self.PcdIsDriver = XmlElement(Item, '%s/PcdIsDriver' % Key)\r
+        self.UefiSpecificationVersion = XmlElement(Item, '%s/UefiSpecificationVersion' % Key)\r
+        self.PiSpecificationVersion = XmlElement(Item, '%s/PiSpecificationVersion' % Key)\r
+        for SubItem in XmlList(Item, '%s/Specification' % Key):\r
+            Specification = XmlElement(SubItem, '/Specification')\r
+            Version = XmlAttribute(XmlNode(SubItem, '/Specification'), 'Version')\r
+            self.SpecificationList.append((Specification, Version))\r
+        for SubItem in XmlList(Item, '%s/BootMode' % Key):\r
+            Axml = BootModeXml()\r
+            BootMode = Axml.FromXml(SubItem, 'BootMode')\r
+            self.BootModes.append(BootMode)\r
+        for SubItem in XmlList(Item, '%s/Event' % Key):\r
+            Axml = EventXml()\r
+            Event = Axml.FromXml(SubItem, 'Event')\r
+            self.Events.append(Event)\r
+        for SubItem in XmlList(Item, '%s/HOB' % Key):\r
+            Axml = HobXml()\r
+            Hob = Axml.FromXml(SubItem, 'HOB')\r
+            self.HOBs.append(Hob)\r
+\r
+        if Header == None:\r
+            Header = ModuleObject()\r
+\r
+        Header.SetModuleType(self.ModuleType)\r
+        Header.SetSupArchList(self.CommonDefines.SupArchList)\r
+        Header.SetModulePath(self.Path)\r
+\r
+        Header.SetPcdIsDriver(self.PcdIsDriver)\r
+        Header.SetUefiSpecificationVersion(self.UefiSpecificationVersion)\r
+        Header.SetPiSpecificationVersion(self.PiSpecificationVersion)\r
+        Header.SetSpecList(self.SpecificationList)\r
+\r
+        return Header, self.BootModes, self.Events, self.HOBs\r
+\r
+\r
+    def ToXml(self, Header, BootModes, Events, Hobs, Key):\r
+        if self.ModuleType:\r
+            pass\r
+        AttributeList = [['SupArchList', GetStringOfList(Header.GetSupArchList())], ]\r
+\r
+        NodeList = [['ModuleType', Header.GetModuleType()],\r
+                    ['Path', Header.GetModulePath()],\r
+                    ['PcdIsDriver', Header.GetPcdIsDriver()],\r
+                    ['UefiSpecificationVersion', Header.GetUefiSpecificationVersion()],\r
+                    ['PiSpecificationVersion', Header.GetPiSpecificationVersion()],\r
+                   ]\r
+        for Item in Header.GetSpecList():\r
+            Spec, Version = Item\r
+            SpecElem = CreateXmlElement('Specification', Spec, [], [['Version', Version]])\r
+            NodeList.append(SpecElem)\r
+\r
+        for Item in BootModes:\r
+            Tmp = BootModeXml()\r
+            NodeList.append(Tmp.ToXml(Item, 'BootMode'))\r
+        for Item in Events:\r
+            Tmp = EventXml()\r
+            NodeList.append(Tmp.ToXml(Item, 'Event'))\r
+        for Item in Hobs:\r
+            Tmp = HobXml()\r
+            NodeList.append(Tmp.ToXml(Item, 'HOB'))\r
+        Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
+\r
+        return Root\r
+\r
+    def __str__(self):\r
+        Str = "ModuleType = %s Path = %s PcdIsDriver = %s UefiSpecificationVersion = %s PiSpecificationVersion = %s \\r
+               Specification = %s SpecificationVersion = %s %s" % \\r
+        (self.ModuleType, self.Path, self.PcdIsDriver, \\r
+         self.UefiSpecificationVersion, self.PiSpecificationVersion, \\r
+         self.SpecificationList, self.SpecificationVersion, self.CommonDefines)\r
+        for Item in self.BootModes:\r
+            Str = Str + '\n\t' + str(Item)\r
+        for Item in self.Events:\r
+            Str = Str + '\n\t' + str(Item)\r
+        for Item in self.HOBs:\r
+            Str = Str + '\n\t' + str(Item)\r
+        return Str\r
+\r
+##\r
+# ModuleXml\r
+#\r
+class ModuleSurfaceAreaXml(object):\r
+    def __init__(self, Package=''):\r
+        self.Module = None\r
+        #\r
+        # indicate the package that this module resides in\r
+        #\r
+        self.Package = Package\r
+\r
+    def FromXml2(self, Item, Module):\r
+        if self.Module:\r
+            pass\r
+        #\r
+        # PeiDepex\r
+        #\r
+        PeiDepexList = []\r
+        for SubItem in XmlList(Item, '/ModuleSurfaceArea/PeiDepex'):\r
+            Tmp = DepexXml()\r
+            Depex = Tmp.FromXml(XmlNode(SubItem, 'PeiDepex'), 'PeiDepex')\r
+            PeiDepexList.append(Depex)\r
+        Module.SetPeiDepex(PeiDepexList)\r
+\r
+        #\r
+        # DxeDepex\r
+        #\r
+        DxeDepexList = []\r
+        for SubItem in XmlList(Item, '/ModuleSurfaceArea/DxeDepex'):\r
+            Tmp = DepexXml()\r
+            Depex = Tmp.FromXml(XmlNode(SubItem, 'DxeDepex'), 'DxeDepex')\r
+            DxeDepexList.append(Depex)\r
+        Module.SetDxeDepex(DxeDepexList)\r
+\r
+        #\r
+        # SmmDepex\r
+        #\r
+        SmmDepexList = []\r
+        for SubItem in XmlList(Item, '/ModuleSurfaceArea/SmmDepex'):\r
+            Tmp = DepexXml()\r
+            Depex = Tmp.FromXml(XmlNode(SubItem, 'SmmDepex'), 'SmmDepex')\r
+            SmmDepexList.append(Depex)\r
+        Module.SetSmmDepex(SmmDepexList)\r
+\r
+        #\r
+        # MiscellaneousFile\r
+        Tmp = MiscellaneousFileXml()\r
+        MiscFileList = Tmp.FromXml(XmlNode(Item, '/ModuleSurfaceArea/MiscellaneousFiles'), 'MiscellaneousFiles')\r
+        if MiscFileList:\r
+            Module.SetMiscFileList([MiscFileList])\r
+        else:\r
+            Module.SetMiscFileList([])\r
+\r
+        #           \r
+        # UserExtensions\r
+        #\r
+        for Item in XmlList(Item, '/ModuleSurfaceArea/UserExtensions'):\r
+            Tmp = UserExtensionsXml()\r
+            UserExtension = Tmp.FromXml(Item, 'UserExtensions')\r
+            Module.SetUserExtensionList(Module.GetUserExtensionList() + [UserExtension])\r
+\r
+        return Module\r
+\r
+    def FromXml(self, Item, Key, IsStandAlongModule=False):\r
+        IsBinaryModule = XmlAttribute(Item, 'BinaryModule')\r
+        #\r
+        # Header\r
+        #\r
+        Tmp = HeaderXml()\r
+        Module = Tmp.FromXml(XmlNode(Item, '/%s/Header' % Key), 'Header', True, IsStandAlongModule)\r
+        Module.SetBinaryModule(IsBinaryModule)\r
+\r
+        if IsBinaryModule:\r
+            GlobalData.gIS_BINARY_INF = True\r
+\r
+        #\r
+        # ModuleProperties\r
+        #\r
+        Tmp = ModulePropertyXml()\r
+        (Module, BootModes, Events, HOBs) = \\r
+        Tmp.FromXml(XmlNode(Item, '/ModuleSurfaceArea/ModuleProperties'), 'ModuleProperties', Module)\r
+        Module.SetBootModeList(BootModes)\r
+        Module.SetEventList(Events)\r
+        Module.SetHobList(HOBs)\r
+        #\r
+        # ClonedFrom\r
+        #\r
+        Tmp = ClonedFromXml()\r
+        ClonedFrom = Tmp.FromXml(XmlNode(Item, '/ModuleSurfaceArea/ClonedFrom'), 'ClonedFrom')\r
+        if ClonedFrom:\r
+            Module.SetClonedFrom(ClonedFrom)\r
+\r
+        #\r
+        # LibraryClass\r
+        #\r
+        for SubItem in XmlList(Item, '/ModuleSurfaceArea/LibraryClassDefinitions/LibraryClass'):\r
+            Tmp = LibraryClassXml()\r
+            LibraryClass = Tmp.FromXml(SubItem, 'LibraryClass')\r
+            Module.SetLibraryClassList(Module.GetLibraryClassList() + [LibraryClass])\r
+\r
+        if XmlList(Item, '/ModuleSurfaceArea/LibraryClassDefinitions') and \\r
+           not XmlList(Item, '/ModuleSurfaceArea/LibraryClassDefinitions/LibraryClass'):\r
+            Module.SetLibraryClassList([None])\r
+\r
+        #\r
+        # SourceFiles\r
+        #\r
+        for SubItem in XmlList(Item, '/ModuleSurfaceArea/SourceFiles/Filename'):\r
+            Tmp = SourceFileXml()\r
+            SourceFile = Tmp.FromXml(SubItem, 'Filename')\r
+            Module.SetSourceFileList(Module.GetSourceFileList() + [SourceFile])\r
+\r
+        if XmlList(Item, '/ModuleSurfaceArea/SourceFiles') and \\r
+           not XmlList(Item, '/ModuleSurfaceArea/SourceFiles/Filename') :\r
+            Module.SetSourceFileList([None])\r
+\r
+        #\r
+        # BinaryFile\r
+        #\r
+        for SubItem in XmlList(Item, '/ModuleSurfaceArea/BinaryFiles/BinaryFile'):\r
+            Tmp = BinaryFileXml()\r
+            BinaryFile = Tmp.FromXml(SubItem, 'BinaryFile')\r
+            Module.SetBinaryFileList(Module.GetBinaryFileList() + [BinaryFile])\r
+\r
+        if XmlList(Item, '/ModuleSurfaceArea/BinaryFiles') and \\r
+           not XmlList(Item, '/ModuleSurfaceArea/BinaryFiles/BinaryFile') :\r
+            Module.SetBinaryFileList([None])\r
+        #\r
+        # PackageDependencies\r
+        #\r
+        for SubItem in XmlList(Item, '/ModuleSurfaceArea/PackageDependencies/Package'):\r
+            Tmp = PackageXml()\r
+            PackageDependency = Tmp.FromXml(SubItem, 'Package')\r
+            Module.SetPackageDependencyList(Module.GetPackageDependencyList() + [PackageDependency])\r
+\r
+        if XmlList(Item, '/ModuleSurfaceArea/PackageDependencies') and \\r
+           not XmlList(Item, '/ModuleSurfaceArea/PackageDependencies/Package'):\r
+            Module.SetPackageDependencyList([None])\r
+\r
+        # \r
+        # Guid\r
+        #\r
+        for SubItem in XmlList(Item, '/ModuleSurfaceArea/Guids/GuidCName'):\r
+            Tmp = GuidXml('Module')\r
+            GuidProtocolPpi = Tmp.FromXml(SubItem, 'GuidCName')\r
+            Module.SetGuidList(Module.GetGuidList() + [GuidProtocolPpi])\r
+\r
+        if XmlList(Item, '/ModuleSurfaceArea/Guids') and not XmlList(Item, '/ModuleSurfaceArea/Guids/GuidCName'):\r
+            Module.SetGuidList([None])\r
+\r
+        #\r
+        # Protocol\r
+        #\r
+        for SubItem in XmlList(Item, '/ModuleSurfaceArea/Protocols/Protocol'):\r
+            Tmp = ProtocolXml('Module')\r
+            GuidProtocolPpi = Tmp.FromXml(SubItem, 'Protocol')\r
+            Module.SetProtocolList(Module.GetProtocolList() + [GuidProtocolPpi])\r
+\r
+        if XmlList(Item, '/ModuleSurfaceArea/Protocols') and not XmlList(Item, '/ModuleSurfaceArea/Protocols/Protocol'):\r
+            Module.SetProtocolList([None])\r
+\r
+        #\r
+        # Ppi\r
+        #\r
+        for SubItem in XmlList(Item, '/ModuleSurfaceArea/PPIs/Ppi'):\r
+            Tmp = PpiXml('Module')\r
+            GuidProtocolPpi = Tmp.FromXml(SubItem, 'Ppi')\r
+            Module.SetPpiList(Module.GetPpiList() + [GuidProtocolPpi])\r
+\r
+        if XmlList(Item, '/ModuleSurfaceArea/PPIs') and not XmlList(Item, '/ModuleSurfaceArea/PPIs/Ppi'):\r
+            Module.SetPpiList([None])\r
+\r
+        #\r
+        # Extern\r
+        #\r
+        for SubItem in XmlList(Item, '/ModuleSurfaceArea/Externs/Extern'):\r
+            Tmp = ExternXml()\r
+            Extern = Tmp.FromXml(SubItem, 'Extern')\r
+            Module.SetExternList(Module.GetExternList() + [Extern])\r
+\r
+        if XmlList(Item, '/ModuleSurfaceArea/Externs') and not XmlList(Item, '/ModuleSurfaceArea/Externs/Extern'):\r
+            Module.SetExternList([None])\r
+\r
+        if not Module.GetBinaryModule():\r
+            #\r
+            # PcdCoded\r
+            #\r
+            for SubItem in XmlList(Item, '/ModuleSurfaceArea/PcdCoded/PcdEntry'):\r
+                Tmp = PcdEntryXml()\r
+                PcdEntry = Tmp.FromXml3(SubItem, 'PcdEntry')\r
+                Module.SetPcdList(Module.GetPcdList() + [PcdEntry])\r
+\r
+            if XmlList(Item, '/ModuleSurfaceArea/PcdCoded') and \\r
+                not XmlList(Item, '/ModuleSurfaceArea/PcdCoded/PcdEntry'):\r
+                Module.SetPcdList([None])\r
+\r
+        Module = self.FromXml2(Item, Module)\r
+        #\r
+        # return the module object\r
+        #\r
+        self.Module = Module\r
+        return self.Module\r
+\r
+    def ToXml(self, Module):\r
+        if self.Package:\r
+            pass\r
+        #\r
+        # Create root node of module surface area\r
+        #\r
+        DomModule = minidom.Document().createElement('ModuleSurfaceArea')\r
+        if Module.GetBinaryModule():\r
+            DomModule.setAttribute('BinaryModule', 'true')\r
+\r
+        #\r
+        # Header\r
+        #\r
+        Tmp = HeaderXml()\r
+        DomModule.appendChild(Tmp.ToXml(Module, 'Header'))\r
+        #\r
+        # ModuleProperties\r
+        #\r
+        Tmp = ModulePropertyXml()\r
+        DomModule.appendChild(Tmp.ToXml(Module, Module.GetBootModeList(), Module.GetEventList(), Module.GetHobList(), \\r
+                                        'ModuleProperties'))\r
+        #\r
+        # ClonedFrom\r
+        #\r
+        Tmp = ClonedFromXml()\r
+        if Module.GetClonedFrom():\r
+            DomModule.appendChild(Tmp.ToXml(Module.GetClonedFrom(), 'ClonedFrom'))\r
+        #\r
+        # LibraryClass\r
+        #\r
+        LibraryClassNode = CreateXmlElement('LibraryClassDefinitions', '', [], [])\r
+        for LibraryClass in Module.GetLibraryClassList():\r
+            Tmp = LibraryClassXml()\r
+            LibraryClassNode.appendChild(Tmp.ToXml2(LibraryClass, 'LibraryClass'))\r
+        DomModule.appendChild(LibraryClassNode)\r
+        #\r
+        # SourceFile\r
+        #\r
+        SourceFileNode = CreateXmlElement('SourceFiles', '', [], [])\r
+        for SourceFile in Module.GetSourceFileList():\r
+            Tmp = SourceFileXml()\r
+            SourceFileNode.appendChild(Tmp.ToXml(SourceFile, 'Filename'))\r
+        DomModule.appendChild(SourceFileNode)\r
+        #\r
+        # BinaryFile\r
+        #\r
+        BinaryFileNode = CreateXmlElement('BinaryFiles', '', [], [])\r
+        for BinaryFile in Module.GetBinaryFileList():\r
+            Tmp = BinaryFileXml()\r
+            BinaryFileNode.appendChild(Tmp.ToXml(BinaryFile, 'BinaryFile'))\r
+        DomModule.appendChild(BinaryFileNode)\r
+        #\r
+        # PackageDependencies\r
+        #\r
+        PackageDependencyNode = CreateXmlElement('PackageDependencies', '', [], [])\r
+        for PackageDependency in Module.GetPackageDependencyList():\r
+            Tmp = PackageXml()\r
+            PackageDependencyNode.appendChild(Tmp.ToXml(PackageDependency, 'Package'))\r
+        DomModule.appendChild(PackageDependencyNode)\r
+\r
+        #\r
+        # Guid\r
+        #\r
+        GuidProtocolPpiNode = CreateXmlElement('Guids', '', [], [])\r
+        for GuidProtocolPpi in Module.GetGuidList():\r
+            Tmp = GuidXml('Module')\r
+            GuidProtocolPpiNode.appendChild(Tmp.ToXml(GuidProtocolPpi, 'GuidCName'))\r
+        DomModule.appendChild(GuidProtocolPpiNode)\r
+\r
+        #\r
+        # Protocol\r
+        #\r
+        GuidProtocolPpiNode = CreateXmlElement('Protocols', '', [], [])\r
+        for GuidProtocolPpi in Module.GetProtocolList():\r
+            Tmp = ProtocolXml('Module')\r
+            GuidProtocolPpiNode.appendChild(Tmp.ToXml(GuidProtocolPpi, 'Protocol'))\r
+        DomModule.appendChild(GuidProtocolPpiNode)\r
+\r
+        #\r
+        # Ppi\r
+        #\r
+        GuidProtocolPpiNode = CreateXmlElement('PPIs', '', [], [])\r
+        for GuidProtocolPpi in Module.GetPpiList():\r
+            Tmp = PpiXml('Module')\r
+            GuidProtocolPpiNode.appendChild(Tmp.ToXml(GuidProtocolPpi, 'Ppi'))\r
+        DomModule.appendChild(GuidProtocolPpiNode)\r
+        #\r
+        # Extern\r
+        #\r
+        ExternNode = CreateXmlElement('Externs', '', [], [])\r
+        for Extern in Module.GetExternList():\r
+            Tmp = ExternXml()\r
+            ExternNode.appendChild(Tmp.ToXml(Extern, 'Extern'))\r
+        DomModule.appendChild(ExternNode)\r
+        #\r
+        # PcdCoded\r
+        #\r
+        PcdEntryNode = CreateXmlElement('PcdCoded', '', [], [])\r
+        for PcdEntry in Module.GetPcdList():\r
+            Tmp = PcdEntryXml()\r
+            PcdEntryNode.appendChild(Tmp.ToXml3(PcdEntry, 'PcdEntry'))\r
+        DomModule.appendChild(PcdEntryNode)\r
+\r
+        #\r
+        # PeiDepex\r
+        #\r
+        if Module.GetPeiDepex():\r
+            for Item in Module.GetPeiDepex():\r
+                Tmp = DepexXml()\r
+                DomModule.appendChild(Tmp.ToXml(Item, 'PeiDepex'))\r
+\r
+        #\r
+        # DxeDepex\r
+        #\r
+        if Module.GetDxeDepex():\r
+            for Item in Module.GetDxeDepex():\r
+                Tmp = DepexXml()\r
+                DomModule.appendChild(Tmp.ToXml(Item, 'DxeDepex'))\r
+\r
+        #\r
+        # SmmDepex\r
+        #\r
+        if Module.GetSmmDepex():\r
+            for Item in Module.GetSmmDepex():\r
+                Tmp = DepexXml()\r
+                DomModule.appendChild(Tmp.ToXml(Item, 'SmmDepex'))\r
+\r
+        #\r
+        # MiscellaneousFile\r
+        #\r
+        if Module.GetMiscFileList():\r
+            Tmp = MiscellaneousFileXml()\r
+            DomModule.appendChild(Tmp.ToXml(Module.GetMiscFileList()[0], 'MiscellaneousFiles'))\r
+        #\r
+        # UserExtensions\r
+        #\r
+        if Module.GetUserExtensionList():\r
+            for UserExtension in Module.GetUserExtensionList():\r
+                Tmp = UserExtensionsXml()\r
+                DomModule.appendChild(Tmp.ToXml(UserExtension, 'UserExtensions'))\r
+\r
+        return DomModule\r
+\r
+##\r
+# BuildFlagXml used to generate BuildFlag for <AsBuilt>\r
+#\r
+class BuildFlagXml(object):\r
+    def __init__(self):\r
+        self.Target = ''\r
+        self.TagName = ''\r
+        self.Family = ''\r
+        self.AsBuiltFlags = ''\r
+\r
+    def FromXml(self, Item, Key):\r
+        self.Target = XmlElement(Item, '%s/Target' % Key)\r
+        self.TagName = XmlElement(Item, '%s/TagName' % Key)\r
+        self.Family = XmlElement(Item, '%s/Family' % Key)\r
+\r
+        BuildFlag = BinaryBuildFlagObject()\r
+\r
+        BuildFlag.SetTarget(self.Target)\r
+        BuildFlag.SetTagName(self.TagName)\r
+        BuildFlag.SetFamily(self.Family)\r
+\r
+        return BuildFlag\r
+\r
+    #\r
+    # For AsBuild INF usage\r
+    #\r
+    def FromXml2(self, Item, Key):\r
+        self.AsBuiltFlags = XmlElement(Item, '%s' % Key)\r
+\r
+        LineList = GetSplitValueList(self.AsBuiltFlags, '\n')\r
+        ReturnLine = ''\r
+        Count = 0\r
+        for Line in LineList:\r
+            if Count == 0:\r
+                ReturnLine = "# " + Line\r
+            else:\r
+                ReturnLine = ReturnLine + '\n' + '# ' + Line\r
+            Count += 1\r
+\r
+        BuildFlag = BinaryBuildFlagObject()\r
+        BuildFlag.SetAsBuiltOptionFlags(ReturnLine)\r
+\r
+        return BuildFlag\r
+\r
+    def ToXml(self, BuildFlag, Key):\r
+        if self.Target:\r
+            pass\r
+        AttributeList = []\r
+        NodeList = []\r
+        NodeList.append(['BuildFlags', BuildFlag])\r
+\r
+        Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
+        return Root\r