]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/UPT/Xml/CommonXml.py
Sync BaseTools Branch (version r2271) to EDKII main trunk.
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Xml / CommonXml.py
diff --git a/BaseTools/Source/Python/UPT/Xml/CommonXml.py b/BaseTools/Source/Python/UPT/Xml/CommonXml.py
new file mode 100644 (file)
index 0000000..fff6e67
--- /dev/null
@@ -0,0 +1,879 @@
+## @file\r
+# This file is used to parse a PCD 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
+CommonXml\r
+'''\r
+\r
+##\r
+# Import Modules\r
+#\r
+\r
+from Core.DistributionPackageClass import DistributionPackageHeaderObject\r
+from Library.String import ConvertNEToNOTEQ\r
+from Library.String import ConvertNOTEQToNE\r
+from Library.String import GetSplitValueList\r
+from Library.String import GetStringOfList\r
+from Library.Xml.XmlRoutines import XmlElement\r
+from Library.Xml.XmlRoutines import XmlElement2\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 FileObject\r
+from Object.POM.CommonObject import MiscFileObject\r
+from Object.POM.CommonObject import UserExtensionObject\r
+from Object.POM.CommonObject import ClonedRecordObject\r
+from Object.POM.CommonObject import LibraryClassObject\r
+from Object.POM.CommonObject import FileNameObject\r
+from Object.POM.ModuleObject import ModuleObject\r
+from Xml.XmlParserMisc import IsRequiredItemListNull\r
+from Xml.XmlParserMisc import GetHelpTextList\r
+\r
+import Library.DataType as DataType\r
+\r
+##\r
+# ClonedFromXml\r
+#\r
+class ClonedFromXml(object):\r
+    def __init__(self):\r
+        self.GUID = ''\r
+        self.Version = ''\r
+\r
+    def FromXml(self, Item, Key):\r
+        self.GUID = XmlElement(Item, '%s/GUID' % Key)\r
+        self.Version = XmlAttribute(XmlNode(Item, '%s/GUID' % Key), 'Version')\r
+\r
+        if self.GUID == '' and self.Version == '':\r
+            return None\r
+\r
+        ClonedFrom = ClonedRecordObject()\r
+        ClonedFrom.SetPackageGuid(self.GUID)\r
+        ClonedFrom.SetPackageVersion(self.Version)\r
+\r
+        return ClonedFrom\r
+\r
+    def ToXml(self, ClonedFrom, Key):\r
+        if self.GUID:\r
+            pass\r
+        Element1 = CreateXmlElement('GUID', ClonedFrom.GetPackageGuid(), [],\r
+                                    [['Version', ClonedFrom.GetPackageVersion()]])\r
+        AttributeList = []\r
+        NodeList = [Element1]\r
+        Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
+\r
+        return Root\r
+\r
+    def __str__(self):\r
+        return "GUID = %s Version = %s" % (self.GUID, self.Version)\r
+\r
+\r
+##\r
+# CommonDefinesXml\r
+#\r
+class CommonDefinesXml(object):\r
+    def __init__(self):\r
+        self.Usage = ''\r
+        self.SupArchList = []\r
+        self.SupModList = []\r
+        self.FeatureFlag = ''\r
+\r
+    def FromXml(self, Item, Key):\r
+        if Key:\r
+            pass\r
+        self.Usage = XmlAttribute(Item, 'Usage')\r
+        self.SupArchList = \\r
+        [Arch for Arch in GetSplitValueList(XmlAttribute(Item, 'SupArchList'), DataType.TAB_SPACE_SPLIT) if Arch]\r
+        self.SupModList = \\r
+        [Mod for Mod in GetSplitValueList(XmlAttribute(Item, 'SupModList'), DataType.TAB_SPACE_SPLIT) if Mod]\r
+        self.FeatureFlag = ConvertNOTEQToNE(XmlAttribute(Item, 'FeatureFlag'))\r
+\r
+\r
+    def ToXml(self):\r
+        pass\r
+\r
+    def __str__(self):\r
+        return "Usage = %s SupArchList = %s SupModList = %s FeatureFlag = %s" \\r
+                % (self.Usage, self.SupArchList, self.SupModList, self.FeatureFlag)\r
+\r
+\r
+##\r
+# HelpTextXml\r
+#\r
+class HelpTextXml(object):\r
+    def __init__(self):\r
+        self.HelpText = ''\r
+        self.Lang = ''\r
+\r
+    def FromXml(self, Item, Key):\r
+        if Key:\r
+            pass\r
+        self.HelpText = XmlElement2(Item, 'HelpText')\r
+        self.Lang = XmlAttribute(Item, 'Lang')\r
+\r
+    def ToXml(self, HelpText, Key='HelpText'):\r
+        if self.HelpText:\r
+            pass\r
+        return CreateXmlElement('%s' % Key, HelpText.GetString(), [], [['Lang', HelpText.GetLang()]])\r
+    def __str__(self):\r
+        return "HelpText = %s Lang = %s" % (self.HelpText, self.Lang)\r
+\r
+##\r
+# HeaderXml\r
+#\r
+class HeaderXml(object):\r
+    def __init__(self):\r
+        self.Name = ''\r
+        self.BaseName = ''\r
+        self.GUID = ''\r
+        self.Version = ''\r
+        self.Copyright = ''\r
+        self.License = ''\r
+        self.Abstract = ''\r
+        self.Description = ''\r
+\r
+    def FromXml(self, Item, Key, IsRequiredCheck=False, IsStandAlongModule=False):\r
+        if not Item and IsRequiredCheck:\r
+            XmlTreeLevel = []\r
+            if IsStandAlongModule:\r
+                XmlTreeLevel = ['DistributionPackage', 'ModuleSurfaceArea']\r
+            else:\r
+                XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea', 'ModuleSurfaceArea']\r
+            CheckDict = {'Header':''}\r
+            IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
+        self.Name = XmlElement(Item, '%s/Name' % Key)\r
+        self.BaseName = XmlAttribute(XmlNode(Item, '%s/Name' % Key), 'BaseName')\r
+        self.GUID = XmlElement(Item, '%s/GUID' % Key)\r
+        self.Version = XmlAttribute(XmlNode(Item, '%s/GUID' % Key), 'Version')\r
+        self.Copyright = XmlElement(Item, '%s/Copyright' % Key)\r
+        self.License = XmlElement(Item, '%s/License' % Key)\r
+        self.Abstract = XmlElement(Item, '%s/Abstract' % Key)\r
+        self.Description = XmlElement(Item, '%s/Description' % Key)\r
+\r
+        ModuleHeader = ModuleObject()\r
+        ModuleHeader.SetName(self.Name)\r
+        ModuleHeader.SetBaseName(self.BaseName)\r
+        ModuleHeader.SetGuid(self.GUID)\r
+        ModuleHeader.SetVersion(self.Version)\r
+        ModuleHeader.SetCopyright(self.Copyright)\r
+        ModuleHeader.SetLicense(self.License)\r
+        ModuleHeader.SetAbstract(self.Abstract)\r
+        ModuleHeader.SetDescription(self.Description)\r
+\r
+        return ModuleHeader\r
+\r
+    def ToXml(self, Header, Key):\r
+        if self.GUID:\r
+            pass\r
+        Element1 = CreateXmlElement('Name', Header.GetName(), [], [['BaseName', Header.GetBaseName()]])\r
+        Element2 = CreateXmlElement('GUID', Header.GetGuid(), [], [['Version', Header.GetVersion()]])\r
+        AttributeList = []\r
+        NodeList = [Element1,\r
+                    Element2,\r
+                    ['Copyright', Header.GetCopyright()],\r
+                    ['License', Header.GetLicense()],\r
+                    ['Abstract', Header.GetAbstract()],\r
+                    ['Description', Header.GetDescription()],\r
+                    ]\r
+        Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
+\r
+        return Root\r
+\r
+    def __str__(self):\r
+        return "Name = %s BaseName = %s GUID = %s Version = %s Copyright = %s \\r
+        License = %s Abstract = %s Description = %s" % \\r
+        (self.Name, self.BaseName, self.GUID, self.Version, self.Copyright, \\r
+         self.License, self.Abstract, self.Description)\r
+##\r
+# DistributionPackageHeaderXml\r
+#\r
+class DistributionPackageHeaderXml(object):\r
+    def __init__(self):\r
+        self.Header = HeaderXml()\r
+        self.ReadOnly = ''\r
+        self.RePackage = ''\r
+        self.Vendor = ''\r
+        self.Date = ''\r
+        self.Signature = ''\r
+        self.XmlSpecification = ''\r
+\r
+    def FromXml(self, Item, Key):\r
+        if not Item:\r
+            return None\r
+        self.ReadOnly = XmlAttribute(XmlNode(Item, '%s' % Key), 'ReadOnly')\r
+        self.RePackage = XmlAttribute(XmlNode(Item, '%s' % Key), 'RePackage')\r
+        self.Vendor = XmlElement(Item, '%s/Vendor' % Key)\r
+        self.Date = XmlElement(Item, '%s/Date' % Key)\r
+        self.Signature = XmlElement(Item, '%s/Signature' % Key)\r
+        self.XmlSpecification = XmlElement(Item, '%s/XmlSpecification' % Key)\r
+        self.Header.FromXml(Item, Key)\r
+\r
+        DistributionPackageHeader = DistributionPackageHeaderObject()\r
+        if self.ReadOnly.upper() == 'TRUE':\r
+            DistributionPackageHeader.ReadOnly = True\r
+        elif self.ReadOnly.upper() == 'FALSE':\r
+            DistributionPackageHeader.ReadOnly = False\r
+\r
+        if self.RePackage.upper() == 'TRUE':\r
+            DistributionPackageHeader.RePackage = True\r
+        elif self.RePackage.upper() == 'FALSE':\r
+            DistributionPackageHeader.RePackage = False\r
+        DistributionPackageHeader.Vendor = self.Vendor\r
+        DistributionPackageHeader.Date = self.Date\r
+        DistributionPackageHeader.Signature = self.Signature\r
+        DistributionPackageHeader.XmlSpecification = self.XmlSpecification\r
+\r
+        DistributionPackageHeader.SetName(self.Header.Name)\r
+        DistributionPackageHeader.SetBaseName(self.Header.BaseName)\r
+        DistributionPackageHeader.SetGuid(self.Header.GUID)\r
+        DistributionPackageHeader.SetVersion(self.Header.Version)\r
+        DistributionPackageHeader.SetCopyright(self.Header.Copyright)\r
+        DistributionPackageHeader.SetLicense(self.Header.License)\r
+        DistributionPackageHeader.SetAbstract(self.Header.Abstract)\r
+        DistributionPackageHeader.SetDescription(self.Header.Description)\r
+\r
+        return DistributionPackageHeader\r
+\r
+    def ToXml(self, DistributionPackageHeader, Key):\r
+        if self.Header:\r
+            pass\r
+        Element1 = CreateXmlElement('Name', \\r
+                                    DistributionPackageHeader.GetName(), [], \\r
+                                    [['BaseName', \\r
+                                    DistributionPackageHeader.GetBaseName()]])\r
+        Element2 = CreateXmlElement('GUID', \\r
+                                    DistributionPackageHeader.GetGuid(), [], \\r
+                                    [['Version', \\r
+                                    DistributionPackageHeader.GetVersion()]])\r
+        AttributeList = []\r
+        if DistributionPackageHeader.ReadOnly != '':\r
+            AttributeList.append(['ReadOnly', str(DistributionPackageHeader.ReadOnly).lower()])\r
+        if DistributionPackageHeader.RePackage != '':\r
+            AttributeList.append(['RePackage', str(DistributionPackageHeader.RePackage).lower()])\r
+\r
+        NodeList = [Element1,\r
+                    Element2,\r
+                    ['Vendor', DistributionPackageHeader.Vendor],\r
+                    ['Date', DistributionPackageHeader.Date],\r
+                    ['Copyright', DistributionPackageHeader.GetCopyright()],\r
+                    ['License', DistributionPackageHeader.GetLicense()],\r
+                    ['Abstract', DistributionPackageHeader.GetAbstract()],\r
+                    ['Description', \\r
+                     DistributionPackageHeader.GetDescription()],\r
+                    ['Signature', DistributionPackageHeader.Signature],\r
+                    ['XmlSpecification', \\r
+                     DistributionPackageHeader.XmlSpecification],\r
+                    ]\r
+        Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
+\r
+        return Root\r
+\r
+    def __str__(self):\r
+        return "ReadOnly = %s RePackage = %s Vendor = %s Date = %s \\r
+        Signature = %s XmlSpecification = %s %s" % \\r
+        (self.ReadOnly, self.RePackage, self.Vendor, self.Date, \\r
+         self.Signature, self.XmlSpecification, self.Header)\r
+##\r
+# PackageHeaderXml\r
+#\r
+class PackageHeaderXml(object):\r
+    def __init__(self):\r
+        self.Header = HeaderXml()\r
+        self.PackagePath = ''\r
+\r
+    def FromXml(self, Item, Key, PackageObject2):\r
+        if not Item:\r
+            XmlTreeLevel = ['DistributionPackage', 'PackageSurfaceArea']\r
+            CheckDict = {'PackageHeader':None, }\r
+            IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
+        self.PackagePath = XmlElement(Item, '%s/PackagePath' % Key)\r
+        self.Header.FromXml(Item, Key)\r
+\r
+        PackageObject2.SetName(self.Header.Name)\r
+        PackageObject2.SetBaseName(self.Header.BaseName)\r
+        PackageObject2.SetGuid(self.Header.GUID)\r
+        PackageObject2.SetVersion(self.Header.Version)\r
+        PackageObject2.SetCopyright(self.Header.Copyright)\r
+        PackageObject2.SetLicense(self.Header.License)\r
+        PackageObject2.SetAbstract(self.Header.Abstract)\r
+        PackageObject2.SetDescription(self.Header.Description)\r
+        PackageObject2.SetPackagePath(self.PackagePath)\r
+\r
+    def ToXml(self, PackageObject2, Key):\r
+        if self.PackagePath:\r
+            pass\r
+        Element1 = \\r
+        CreateXmlElement('Name', PackageObject2.GetName(), [], \\r
+                         [['BaseName', PackageObject2.GetBaseName()]])\r
+        Element2 = CreateXmlElement('GUID', PackageObject2.GetGuid(), [], \\r
+                                    [['Version', PackageObject2.GetVersion()]])\r
+        AttributeList = []\r
+        NodeList = [Element1,\r
+                    Element2,\r
+                    ['Copyright', PackageObject2.GetCopyright()],\r
+                    ['License', PackageObject2.GetLicense()],\r
+                    ['Abstract', PackageObject2.GetAbstract()],\r
+                    ['Description', PackageObject2.GetDescription()],\r
+                    ['PackagePath', PackageObject2.GetPackagePath()],\r
+                    ]\r
+        Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
+\r
+        return Root\r
+\r
+    def __str__(self):\r
+        return "PackagePath = %s %s" \\r
+               % (self.PackagePath, self.Header)\r
+\r
+##\r
+# MiscellaneousFileXml\r
+#\r
+class MiscellaneousFileXml(object):\r
+    def __init__(self):\r
+        self.Header = HeaderXml()\r
+        self.Files = []\r
+    ##\r
+    # This API is used for Package or Module's MiscellaneousFile section\r
+    #\r
+    def FromXml(self, Item, Key):\r
+        if not Item:\r
+            return None\r
+        self.Header.FromXml(Item, Key)\r
+        NewItem = XmlNode(Item, '%s/Header' % Key)\r
+        self.Header.FromXml(NewItem, 'Header')\r
+\r
+        for SubItem in XmlList(Item, '%s/Filename' % Key):\r
+            Filename = XmlElement(SubItem, '%s/Filename' % Key)\r
+            Executable = XmlAttribute(XmlNode(SubItem, '%s/Filename' % Key), 'Executable')\r
+            if Executable.upper() == "TRUE":\r
+                Executable = True\r
+            else:\r
+                Executable = False\r
+            self.Files.append([Filename, Executable])\r
+\r
+        MiscFile = MiscFileObject()\r
+        MiscFile.SetCopyright(self.Header.Copyright)\r
+        MiscFile.SetLicense(self.Header.License)\r
+        MiscFile.SetAbstract(self.Header.Abstract)\r
+        MiscFile.SetDescription(self.Header.Description)\r
+        MiscFileList = []\r
+        for File in self.Files:\r
+            FileObj = FileObject()\r
+            FileObj.SetURI(File[0])\r
+            FileObj.SetExecutable(File[1])\r
+            MiscFileList.append(FileObj)\r
+        MiscFile.SetFileList(MiscFileList)\r
+\r
+        return MiscFile\r
+    ##\r
+    # This API is used for DistP's tool section\r
+    #\r
+    def FromXml2(self, Item, Key):\r
+        if Item is None:\r
+            return None\r
+\r
+        NewItem = XmlNode(Item, '%s/Header' % Key)\r
+        self.Header.FromXml(NewItem, 'Header')\r
+\r
+        for SubItem in XmlList(Item, '%s/Filename' % Key):\r
+            Filename = XmlElement(SubItem, '%s/Filename' % Key)\r
+            Executable = \\r
+            XmlAttribute(XmlNode(SubItem, '%s/Filename' % Key), 'Executable')\r
+            OsType = XmlAttribute(XmlNode(SubItem, '%s/Filename' % Key), 'OS')\r
+            if Executable.upper() == "TRUE":\r
+                Executable = True\r
+            else:\r
+                Executable = False\r
+            self.Files.append([Filename, Executable, OsType])\r
+\r
+        MiscFile = MiscFileObject()\r
+        MiscFile.SetName(self.Header.Name)\r
+        MiscFile.SetCopyright(self.Header.Copyright)\r
+        MiscFile.SetLicense(self.Header.License)\r
+        MiscFile.SetAbstract(self.Header.Abstract)\r
+        MiscFile.SetDescription(self.Header.Description)\r
+        MiscFileList = []\r
+        for File in self.Files:\r
+            FileObj = FileObject()\r
+            FileObj.SetURI(File[0])\r
+            FileObj.SetExecutable(File[1])\r
+            FileObj.SetOS(File[2])\r
+            MiscFileList.append(FileObj)\r
+        MiscFile.SetFileList(MiscFileList)\r
+\r
+        return MiscFile\r
+\r
+    ##\r
+    # This API is used for Package or Module's MiscellaneousFile section\r
+    #\r
+    def ToXml(self, MiscFile, Key):\r
+        if self.Header:\r
+            pass\r
+        if MiscFile:\r
+            NodeList = [['Copyright', MiscFile.GetCopyright()],\r
+                        ['License', MiscFile.GetLicense()],\r
+                        ['Abstract', MiscFile.GetAbstract()],\r
+                        ['Description', MiscFile.GetDescription()],\r
+                       ]\r
+\r
+            for File in MiscFile.GetFileList():\r
+                NodeList.append\\r
+                (CreateXmlElement\\r
+                 ('Filename', File.GetURI(), [], \\r
+                  [['Executable', str(File.GetExecutable()).lower()]]))\r
+            Root = CreateXmlElement('%s' % Key, '', NodeList, [])\r
+\r
+            return Root\r
+    ##\r
+    # This API is used for DistP's tool section\r
+    #\r
+    def ToXml2(self, MiscFile, Key):\r
+        if self.Header:\r
+            pass\r
+        if MiscFile:\r
+            NodeList = [['Name', MiscFile.GetName()],\r
+                        ['Copyright', MiscFile.GetCopyright()],\r
+                        ['License', MiscFile.GetLicense()],\r
+                        ['Abstract', MiscFile.GetAbstract()],\r
+                        ['Description', MiscFile.GetDescription()],\r
+                       ]\r
+            HeaderNode = CreateXmlElement('Header', '', NodeList, [])\r
+            NodeList = [HeaderNode]\r
+\r
+            for File in MiscFile.GetFileList():\r
+                NodeList.append\\r
+                (CreateXmlElement\\r
+                 ('Filename', File.GetURI(), [], \\r
+                  [['Executable', str(File.GetExecutable()).lower()], \\r
+                   ['OS', File.GetOS()]]))\r
+            Root = CreateXmlElement('%s' % Key, '', NodeList, [])\r
+\r
+            return Root\r
+\r
+    def __str__(self):\r
+        Str = str(self.Header)\r
+        for Item in self.Files:\r
+            Str = Str + '\n\tFilename:' + str(Item)\r
+        return Str\r
+##\r
+# UserExtensionsXml\r
+#\r
+class UserExtensionsXml(object):\r
+    def __init__(self):\r
+        self.UserId = ''\r
+        self.Identifier = ''\r
+        self.DefineDict = {}\r
+        self.BuildOptionDict = {}\r
+        self.IncludesDict = {}\r
+        self.SourcesDict = {}\r
+        self.BinariesDict = {}\r
+        self.SupArchList = []\r
+        self.Statement = ''\r
+        self.Defines = ''\r
+        self.BuildOptions = ''\r
+\r
+    def FromXml2(self, Item, Key):\r
+        self.UserId = XmlAttribute(XmlNode(Item, '%s' % Key), 'UserId')\r
+        self.Identifier = XmlAttribute(XmlNode(Item, '%s' % Key), 'Identifier')\r
+\r
+        UserExtension = UserExtensionObject()\r
+        UserExtension.SetUserID(self.UserId)\r
+        UserExtension.SetIdentifier(self.Identifier)\r
+\r
+        return UserExtension\r
+\r
+    def FromXml(self, Item, Key):\r
+        self.UserId = XmlAttribute(XmlNode(Item, '%s' % Key), 'UserId')\r
+        self.Identifier = XmlAttribute(XmlNode(Item, '%s' % Key), 'Identifier')\r
+\r
+        DefineItem = XmlNode(Item, '%s/Define' % Key)\r
+        for SubItem in XmlList(DefineItem, 'Define/Statement'):\r
+            Statement = XmlElement(SubItem, '%s/Statement' % Key)\r
+            self.DefineDict[Statement] = ""\r
+\r
+        BuildOptionItem = XmlNode(Item, '%s/BuildOption' % Key)\r
+        for SubItem in XmlList(BuildOptionItem, 'BuildOption/Statement'):\r
+            Statement = XmlElement(SubItem, '%s/Statement' % Key)\r
+            Arch = XmlAttribute(XmlNode(SubItem, '%s/Statement' % Key), 'SupArchList')\r
+            self.BuildOptionDict[Arch] = Statement\r
+\r
+        IncludesItem = XmlNode(Item, '%s/Includes' % Key)\r
+        for SubItem in XmlList(IncludesItem, 'Includes/Statement'):\r
+            Statement = XmlElement(SubItem, '%s/Statement' % Key)\r
+            Arch = XmlAttribute(XmlNode(SubItem, '%s/Statement' % Key), 'SupArchList')\r
+            self.IncludesDict[Statement] = Arch\r
+\r
+        SourcesItem = XmlNode(Item, '%s/Sources' % Key)\r
+        Tmp = UserExtensionSourceXml()\r
+        SourceDict = Tmp.FromXml(SourcesItem, 'Sources')\r
+        self.SourcesDict = SourceDict\r
+\r
+        BinariesItem = XmlNode(Item, '%s/Binaries' % Key)\r
+        Tmp = UserExtensionBinaryXml()\r
+        BinariesDict = Tmp.FromXml(BinariesItem, 'Binaries')\r
+        self.BinariesDict = BinariesDict\r
+\r
+        self.Statement = XmlElement(Item, 'UserExtensions')\r
+        SupArch = XmlAttribute(XmlNode(Item, '%s' % Key), 'SupArchList')\r
+        self.SupArchList = [Arch for Arch in GetSplitValueList(SupArch, DataType.TAB_SPACE_SPLIT) if Arch]\r
+\r
+        UserExtension = UserExtensionObject()\r
+        UserExtension.SetUserID(self.UserId)\r
+        UserExtension.SetIdentifier(self.Identifier)\r
+        UserExtension.SetStatement(self.Statement)\r
+        UserExtension.SetSupArchList(self.SupArchList)\r
+        UserExtension.SetDefinesDict(self.DefineDict)\r
+        UserExtension.SetBuildOptionDict(self.BuildOptionDict)\r
+        UserExtension.SetIncludesDict(self.IncludesDict)\r
+        UserExtension.SetSourcesDict(self.SourcesDict)\r
+        UserExtension.SetBinariesDict(self.BinariesDict)\r
+\r
+        return UserExtension\r
+\r
+    def ToXml(self, UserExtension, Key):\r
+        if self.UserId:\r
+            pass\r
+\r
+        AttributeList = [['UserId', str(UserExtension.GetUserID())],\r
+                         ['Identifier', str(UserExtension.GetIdentifier())],\r
+                         ['SupArchList', \\r
+                          GetStringOfList(UserExtension.GetSupArchList())],\r
+                        ]\r
+\r
+        Root = CreateXmlElement('%s' % Key, UserExtension.GetStatement(), [], \\r
+                                AttributeList)\r
+\r
+        NodeList = []\r
+        DefineDict = UserExtension.GetDefinesDict()\r
+        if DefineDict:\r
+            for Item in DefineDict.keys():\r
+                NodeList.append(CreateXmlElement\\r
+                                ('Statement', Item, [], []))\r
+            DefineElement = CreateXmlElement('Define', '', NodeList, [])\r
+            Root.appendChild(DefineElement)\r
+\r
+        NodeList = []\r
+        BuildOptionDict = UserExtension.GetBuildOptionDict()\r
+        if BuildOptionDict:\r
+            for Item in BuildOptionDict.keys():\r
+                NodeList.append(CreateXmlElement\\r
+                                ('Statement', BuildOptionDict[Item], [], \\r
+                                 [['SupArchList', Item]]))\r
+            BuildOptionElement = \\r
+            CreateXmlElement('BuildOption', '', NodeList, [])\r
+            Root.appendChild(BuildOptionElement)\r
+\r
+        NodeList = []\r
+        IncludesDict = UserExtension.GetIncludesDict()\r
+        if IncludesDict:\r
+            for Item in IncludesDict.keys():\r
+                NodeList.append(CreateXmlElement\\r
+                                ('Statement', Item, [], \\r
+                                 [['SupArchList', IncludesDict[Item]]]))\r
+            IncludesElement = CreateXmlElement('Includes', '', NodeList, [])\r
+            Root.appendChild(IncludesElement)\r
+\r
+        NodeList = []\r
+        SourcesDict = UserExtension.GetSourcesDict()\r
+        if SourcesDict:\r
+            Tmp = UserExtensionSourceXml()\r
+            Root.appendChild(Tmp.ToXml(SourcesDict, 'Sources'))\r
+\r
+        NodeList = []\r
+        BinariesDict = UserExtension.GetBinariesDict()\r
+        if BinariesDict:\r
+            Tmp = UserExtensionBinaryXml()\r
+            Root.appendChild(Tmp.ToXml(BinariesDict, 'Binaries'))\r
+\r
+        return Root\r
+\r
+    def __str__(self):\r
+        Str = "UserId = %s Identifier = %s" % (self.UserId, self.Identifier)\r
+        Str = Str + '\n\tDefines:' + str(self.Defines)\r
+        Str = Str + '\n\tBuildOptions:' + str(self.BuildOptions)\r
+        return Str\r
+\r
+##\r
+# UserExtensionSourceXml\r
+#\r
+class UserExtensionSourceXml(object):\r
+    def __init__(self):\r
+        self.UserExtensionSource = ''\r
+\r
+    def FromXml(self, Item, Key):\r
+        if Key:\r
+            pass\r
+        if self.UserExtensionSource:\r
+            pass\r
+        Dict = {}\r
+\r
+        #SourcesItem = XmlNode(Item, '%s/Sources' % Key)\r
+        for SubItem in XmlList(Item, 'Sources/SourceFile'):\r
+            FileName = XmlElement(SubItem, 'SourceFile/FileName')\r
+            Family = XmlElement(SubItem, 'SourceFile/Family')\r
+            FeatureFlag = XmlElement(SubItem, 'SourceFile/FeatureFlag')\r
+            SupArchStr = XmlElement(SubItem, 'SourceFile/SupArchList')\r
+            DictKey = (FileName, Family, FeatureFlag, SupArchStr)\r
+\r
+            ValueList = []\r
+            for ValueNodeItem in XmlList(SubItem, \\r
+                                         'SourceFile/SourceFileOtherAttr'):\r
+                TagName = XmlElement(ValueNodeItem, \\r
+                                     'SourceFileOtherAttr/TagName')\r
+                ToolCode = XmlElement(ValueNodeItem, \\r
+                                      'SourceFileOtherAttr/ToolCode')\r
+                Comment = XmlElement(ValueNodeItem, \\r
+                                     'SourceFileOtherAttr/Comment')\r
+                if (TagName == ' ') and (ToolCode == ' ') and (Comment == ' '):\r
+                    TagName = ''\r
+                    ToolCode = ''\r
+                    Comment = ''\r
+                ValueList.append((TagName, ToolCode, Comment))\r
+\r
+            Dict[DictKey] = ValueList\r
+\r
+        return Dict\r
+\r
+    def ToXml(self, Dict, Key):\r
+        if self.UserExtensionSource:\r
+            pass\r
+        SourcesNodeList = []\r
+        for Item in Dict:\r
+            ValueList = Dict[Item]\r
+            (FileName, Family, FeatureFlag, SupArchStr) = Item\r
+            SourceFileNodeList = []\r
+            SourceFileNodeList.append(["FileName", FileName])\r
+            SourceFileNodeList.append(["Family", Family])\r
+            SourceFileNodeList.append(["FeatureFlag", FeatureFlag])\r
+            SourceFileNodeList.append(["SupArchList", SupArchStr])\r
+            for (TagName, ToolCode, Comment) in ValueList:\r
+                ValueNodeList = []\r
+                if not (TagName or ToolCode or Comment):\r
+                    TagName = ' '\r
+                    ToolCode = ' '\r
+                    Comment = ' '\r
+                ValueNodeList.append(["TagName", TagName])\r
+                ValueNodeList.append(["ToolCode", ToolCode])\r
+                ValueNodeList.append(["Comment", Comment])\r
+                ValueNodeXml = CreateXmlElement('SourceFileOtherAttr', '', \\r
+                                                ValueNodeList, [])\r
+                SourceFileNodeList.append(ValueNodeXml)\r
+            SourceFileNodeXml = CreateXmlElement('SourceFile', '', \\r
+                                                 SourceFileNodeList, [])\r
+            SourcesNodeList.append(SourceFileNodeXml)\r
+        Root = CreateXmlElement('%s' % Key, '', SourcesNodeList, [])\r
+        return Root\r
+\r
+##\r
+# UserExtensionBinaryXml\r
+#\r
+class UserExtensionBinaryXml(object):\r
+    def __init__(self):\r
+        self.UserExtensionBinary = ''\r
+\r
+    def FromXml(self, Item, Key):\r
+        if Key:\r
+            pass\r
+        if self.UserExtensionBinary:\r
+            pass\r
+\r
+        Dict = {}\r
+\r
+        for SubItem in XmlList(Item, 'Binaries/Binary'):\r
+            FileName = XmlElement(SubItem, 'Binary/FileName')\r
+            FileType = XmlElement(SubItem, 'Binary/FileType')\r
+            FFE = XmlElement(SubItem, 'Binary/FeatureFlag')\r
+            SupArch = XmlElement(SubItem, 'Binary/SupArchList')\r
+            DictKey = (FileName, FileType, ConvertNOTEQToNE(FFE), SupArch)\r
+\r
+            ValueList = []\r
+            for ValueNodeItem in XmlList(SubItem, \\r
+                                         'Binary/BinaryFileOtherAttr'):\r
+                Target = XmlElement(ValueNodeItem, \\r
+                                    'BinaryFileOtherAttr/Target')\r
+                Family = XmlElement(ValueNodeItem, \\r
+                                    'BinaryFileOtherAttr/Family')\r
+                TagName = XmlElement(ValueNodeItem, \\r
+                                     'BinaryFileOtherAttr/TagName')\r
+                Comment = XmlElement(ValueNodeItem, \\r
+                                     'BinaryFileOtherAttr/Comment')\r
+                if (Target == ' ') and (Family == ' ') and \\r
+                   (TagName == ' ') and (Comment == ' '):\r
+                    Target = ''\r
+                    Family = ''\r
+                    TagName = ''\r
+                    Comment = ''\r
+\r
+                ValueList.append((Target, Family, TagName, Comment))\r
+\r
+            Dict[DictKey] = ValueList\r
+\r
+        return Dict\r
+\r
+    def ToXml(self, Dict, Key):\r
+        if self.UserExtensionBinary:\r
+            pass\r
+        BinariesNodeList = []\r
+        for Item in Dict:\r
+            ValueList = Dict[Item]\r
+            (FileName, FileType, FeatureFlag, SupArch) = Item\r
+            FileNodeList = []\r
+            FileNodeList.append(["FileName", FileName])\r
+            FileNodeList.append(["FileType", FileType])\r
+            FileNodeList.append(["FeatureFlag", ConvertNEToNOTEQ(FeatureFlag)])\r
+            FileNodeList.append(["SupArchList", SupArch])\r
+            for (Target, Family, TagName, Comment) in ValueList:\r
+                ValueNodeList = []\r
+                if not (Target or Family or TagName or Comment):\r
+                    Target = ' '\r
+                    Family = ' '\r
+                    TagName = ' '\r
+                    Comment = ' '\r
+                ValueNodeList.append(["Target", Target])\r
+                ValueNodeList.append(["Family", Family])\r
+                ValueNodeList.append(["TagName", TagName])\r
+                ValueNodeList.append(["Comment", Comment])\r
+                ValueNodeXml = CreateXmlElement('BinaryFileOtherAttr', '', \\r
+                                                ValueNodeList, [])\r
+                FileNodeList.append(ValueNodeXml)\r
+            FileNodeXml = CreateXmlElement('Binary', '', FileNodeList, [])\r
+            BinariesNodeList.append(FileNodeXml)\r
+        Root = CreateXmlElement('%s' % Key, '', BinariesNodeList, [])\r
+        return Root\r
+\r
+##\r
+# LibraryClassXml\r
+#\r
+class LibraryClassXml(object):\r
+    def __init__(self):\r
+        self.Keyword = ''\r
+        self.HeaderFile = ''\r
+        self.RecommendedInstanceGuid = ''\r
+        self.RecommendedInstanceVersion = ''\r
+        self.CommonDefines = CommonDefinesXml()\r
+        self.HelpText = []\r
+\r
+    def FromXml(self, Item, Key):\r
+        self.Keyword = XmlAttribute(XmlNode(Item, '%s' % Key), 'Keyword')\r
+        if self.Keyword == '':\r
+            self.Keyword = XmlElement(Item, '%s/Keyword' % Key)\r
+        self.HeaderFile = XmlElement(Item, '%s/HeaderFile' % Key)\r
+        self.CommonDefines.FromXml(XmlNode(Item, '%s' % Key), 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
+        LibraryClass = LibraryClassObject()\r
+        LibraryClass.SetLibraryClass(self.Keyword)\r
+        LibraryClass.SetIncludeHeader(self.HeaderFile)\r
+        if self.CommonDefines.Usage:\r
+            LibraryClass.SetUsage(self.CommonDefines.Usage)\r
+        LibraryClass.SetSupArchList(self.CommonDefines.SupArchList)\r
+        LibraryClass.SetSupModuleList(self.CommonDefines.SupModList)\r
+        LibraryClass.SetFeatureFlag(ConvertNOTEQToNE(self.CommonDefines.FeatureFlag))\r
+        LibraryClass.SetHelpTextList(GetHelpTextList(self.HelpText))\r
+\r
+        return LibraryClass\r
+\r
+    def ToXml(self, LibraryClass, Key):\r
+        if self.HeaderFile:\r
+            pass\r
+        AttributeList = \\r
+        [['Keyword', LibraryClass.GetLibraryClass()],\r
+         ['SupArchList', GetStringOfList(LibraryClass.GetSupArchList())],\r
+         ['SupModList', GetStringOfList(LibraryClass.GetSupModuleList())]\r
+         ]\r
+        NodeList = [['HeaderFile', LibraryClass.GetIncludeHeader()]]\r
+        for Item in LibraryClass.GetHelpTextList():\r
+            Tmp = HelpTextXml()\r
+            NodeList.append(Tmp.ToXml(Item))\r
+\r
+        Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
+\r
+        return Root\r
+\r
+    def ToXml2(self, LibraryClass, Key):\r
+        if self.HeaderFile:\r
+            pass\r
+\r
+        FeatureFlag = ConvertNEToNOTEQ(LibraryClass.GetFeatureFlag())\r
+\r
+        AttributeList = \\r
+        [['Usage', LibraryClass.GetUsage()], \\r
+         ['SupArchList', GetStringOfList(LibraryClass.GetSupArchList())], \\r
+         ['SupModList', GetStringOfList(LibraryClass.GetSupModuleList())], \\r
+         ['FeatureFlag', FeatureFlag]\r
+         ]\r
+        NodeList = [['Keyword', LibraryClass.GetLibraryClass()], ]\r
+        for Item in LibraryClass.GetHelpTextList():\r
+            Tmp = HelpTextXml()\r
+            NodeList.append(Tmp.ToXml(Item))\r
+\r
+        Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
+\r
+        return Root\r
+\r
+    def __str__(self):\r
+        Str = "Keyword = %s HeaderFile = %s RecommendedInstanceGuid = %s RecommendedInstanceVersion = %s %s" % \\r
+              (self.Keyword, self.HeaderFile, self.RecommendedInstanceGuid, self.RecommendedInstanceVersion, \\r
+              self.CommonDefines)\r
+        for Item in self.HelpText:\r
+            Str = Str + "\n\t" + str(Item)\r
+        return Str\r
+\r
+##\r
+# FilenameXml\r
+#\r
+class FilenameXml(object):\r
+    def __init__(self):\r
+        self.FileType = ''\r
+        self.Filename = ''\r
+        self.CommonDefines = CommonDefinesXml()\r
+\r
+    def FromXml(self, Item, Key):\r
+        self.FileType = XmlAttribute(Item, 'FileType')\r
+        self.Filename = XmlElement(Item, 'Filename')\r
+        self.CommonDefines.FromXml(Item, Key)\r
+\r
+        FeatureFlag = ConvertNOTEQToNE(self.CommonDefines.FeatureFlag)\r
+\r
+        Filename = FileNameObject()\r
+        #\r
+        # Convert File Type\r
+        #\r
+        if self.FileType == 'UEFI_IMAGE':\r
+            self.FileType = 'PE32'\r
+\r
+        Filename.SetFileType(self.FileType)\r
+        Filename.SetFilename(self.Filename)\r
+        Filename.SetSupArchList(self.CommonDefines.SupArchList)\r
+        Filename.SetFeatureFlag(FeatureFlag)\r
+\r
+        return Filename\r
+\r
+    def ToXml(self, Filename, Key):\r
+        if self.Filename:\r
+            pass\r
+        AttributeList = [['SupArchList', \\r
+                          GetStringOfList(Filename.GetSupArchList())],\r
+                         ['FileType', Filename.GetFileType()],\r
+                         ['FeatureFlag', ConvertNEToNOTEQ(Filename.GetFeatureFlag())],\r
+                        ]\r
+        Root = CreateXmlElement('%s' % Key, Filename.GetFilename(), [], AttributeList)\r
+\r
+        return Root\r
+\r
+    def __str__(self):\r
+        return "FileType = %s Filename = %s %s" \\r
+             % (self.FileType, self.Filename, self.CommonDefines)\r