## @file
# Open an MSA file and load all its contents to a ModuleClass object.
#
# Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>
# This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution.  The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#

##
# Import Modules
#
import os
from CommonDataClass.ModuleClass import *
from Common.XmlRoutines import *
from Common.MigrationUtilities import *


## Load a list of Module Cloned Records.
#
# Read an input Module XML DOM object and return a list of Cloned Records
# contained in the DOM object.
#
# @param  XmlMsa               An XML DOM object read from MSA file.
#
# @retvel ClonedRecords        A list of Cloned Records loaded from XmlMsa.
#
def LoadModuleClonedRecords(XmlMsa):
    XmlTag = "ModuleSurfaceArea/ModuleDefinitions/ClonedFrom/Cloned"
    return map(LoadClonedRecord, XmlList(XmlMsa, XmlTag))

## Load Module Header.
#
# Read an input Module XML DOM object and return Module Header class object
# contained in the DOM object.
#
# @param  XmlMsa               An XML DOM object read from MSA file.
# @param  MsaFileName          The file path of MSA File.
#
# @retvel ModuleHeader         A new Module Header object loaded from XmlMsa.
#
def LoadModuleHeader(XmlMsa, MsaFileName):
    ModuleHeader = ModuleHeaderClass()
    
    XmlTag = "ModuleSurfaceArea/MsaHeader"
    MsaHeader = XmlNode(XmlMsa, XmlTag)
    
    SetIdentification(ModuleHeader, MsaHeader, "ModuleName", MsaFileName)
    SetCommonHeader(ModuleHeader, MsaHeader)

    XmlTag = "ModuleSurfaceArea/ModuleDefinitions/SupportedArchitectures"
    ModuleHeader.SupArchList = XmlElement(XmlMsa, XmlTag).split()

    XmlTag = "ModuleSurfaceArea/ModuleDefinitions/BinaryModule"
    if XmlElement(XmlMsa, XmlTag).lower() == "true":
        ModuleHeader.BinaryModule = True

    XmlTag = "ModuleSurfaceArea/ModuleDefinitions/OutputFileBasename"
    ModuleHeader.OutputFileBasename = XmlElement(XmlMsa, XmlTag)
    
    XmlTag = "ModuleSurfaceArea/ModuleDefinitions/ClonedForm"
    ModuleHeader.ClonedFrom = LoadModuleClonedRecords(XmlMsa)

    XmlTag = "ModuleSurfaceArea/Externs/PcdDriverTypes"
    ModuleHeader.PcdIsDriver = XmlElement(XmlMsa, XmlTag)
    
    XmlTag = "ModuleSurfaceArea/Externs/TianoEdkFlashMap_h"
    if XmlElement(XmlMsa, XmlTag).lower() == "true":
        ModuleHeader.TianoEdkFlashMap_h = True

    XmlTag = "ModuleSurfaceArea/Externs/Specification"
    for Specification in XmlElementList(XmlMsa, XmlTag):
        AddToSpecificationDict(ModuleHeader.Specification, Specification)
        
    return ModuleHeader


## Load a list of Module Library Classes.
#
# Read an input Module XML DOM object and return a list of Library Classes
# contained in the DOM object.
#
# @param  XmlMsa               An XML DOM object read from MSA file.
#
# @retvel LibraryClasses       A list of Library Classes loaded from XmlMsa.
#
def LoadModuleLibraryClasses(XmlMsa):
    XmlTag = "ModuleSurfaceArea/LibraryClassDefinitions/LibraryClass"
    return map(LoadLibraryClass, XmlList(XmlMsa, XmlTag))
    

## Load a new Module Source class object.
#
# Read an input XML Source DOM object and return an object of Source
# contained in the DOM object.
#
# @param  XmlFilename          A child XML DOM object in Module XML DOM.
#
# @retvel ModuleSource         A new Source object created by XmlFilename.
#
def LoadModuleSource(XmlFilename):
    ModuleSource = ModuleSourceFileClass()
    
    ModuleSource.SourceFile = XmlElementData(XmlFilename)

    XmlTag = "TagName"
    ModuleSource.TagName = XmlAttribute(XmlFilename, XmlTag)
    
    XmlTag = "ToolCode"
    ModuleSource.ToolCode = XmlAttribute(XmlFilename, XmlTag)
    
    XmlTag = "ToolChainFamily"
    ModuleSource.ToolChainFamily = XmlAttribute(XmlFilename, XmlTag)
    
    SetCommon(ModuleSource, XmlFilename)
    
    return ModuleSource


## Load a list of Module Sources.
#
# Read an input Module XML DOM object and return a list of Sources
# contained in the DOM object.
#
# @param  XmlMsa               An XML DOM object read from MSA file.
#
# @retvel Sources              A list of Sources loaded from XmlMsa.
#
def LoadModuleSources(XmlMsa):
    XmlTag = "ModuleSurfaceArea/SourceFiles/Filename"
    return map(LoadModuleSource, XmlList(XmlMsa, XmlTag))


## Load a new Module Binary class object.
#
# Read an input XML Binary DOM object and return an object of Binary
# contained in the DOM object.
#
# @param  XmlFilename          A child XML DOM object in Module XML DOM.
#
# @retvel ModuleBinary         A new Binary object created by XmlFilename.
#
def LoadModuleBinary(XmlFilename):
    ModuleBinary = ModuleBinaryFileClass()
    
    ModuleBinary.BinaryFile = XmlElementData(XmlFilename)
    
    XmlTag = "FileType"
    ModuleBinary.FileType = XmlElementAttribute(XmlFilename, XmlTag)
    
    SetCommon(ModuleBinary, XmlFilename)
    

## Load a list of Module Binaries.
#
# Read an input Module XML DOM object and return a list of Binaries
# contained in the DOM object.
#
# @param  XmlMsa               An XML DOM object read from MSA file.
#
# @retvel Binaries             A list of Binaries loaded from XmlMsa.
#
def LoadModuleBinaries(XmlMsa):
    XmlTag = "ModuleSurfaceArea/BinaryFiles/Filename"
    return map(LoadModuleBinary, XmlList(XmlMsa, XmlTag))


## Load a list of Module Non Processed Files.
#
# Read an input Module XML DOM object and return a list of Non Processed Files
# contained in the DOM object.
#
# @param  XmlMsa               An XML DOM object read from MSA file.
#
# @retvel NonProcessedFiles    A list of Non Processed Files loaded from XmlMsa.
#
def LoadModuleNonProcessedFiles(XmlMsa):
    XmlTag = "ModuleSurfaceArea/NonProcessedFiles/Filename"
    return XmlElementList(XmlMsa, XmlTag)


## Load a new Module Package Dependency class object.
#
# Read an input XML PackageDependency DOM object and return an object of Package Dependency
# contained in the DOM object.
#
# @param  XmlPackage              A child XML DOM object in Module XML DOM.
#
# @retvel ModulePackageDependency A new Package Dependency object created by XmlPackage.
#
def LoadModulePackageDependency(XmlPackage):
    ModulePackageDependency = ModulePackageDependencyClass()

    XmlTag = "PackageGuid"
    PackageKey = XmlAttribute(XmlPackage, XmlTag)
    
    #
    #TODO: Add resolution for Package name, package Version
    #
    ModulePackageDependency.PackageGuid = PackageKey
    SetCommon(ModulePackageDependency, XmlPackage)

    return ModulePackageDependency
    

## Load a list of Module Package Dependencies.
#
# Read an input Module XML DOM object and return a list of Package Dependencies
# contained in the DOM object.
#
# @param  XmlMsa               An XML DOM object read from MSA file.
#
# @retvel PackageDependencies  A list of Package Dependencies loaded from XmlMsa.
#
def LoadModulePackageDependencies(XmlMsa):
    XmlTag = "ModuleSurfaceArea/PackageDependencies/Package"
    return map(LoadModulePackageDependency, XmlList(XmlMsa, XmlTag))


## Load a list of Module Protocols.
#
# Read an input Module XML DOM object and return a list of Protocols
# contained in the DOM object.
#
# @param  XmlMsa               An XML DOM object read from MSA file.
#
# @retvel Protocols            A list of Protocols loaded from XmlMsa.
#
def LoadModuleProtocols(XmlMsa):
    XmlTag = "ModuleSurfaceArea/Protocols/Protocol"
    XmlProtocolList = XmlList(XmlMsa, XmlTag)

    XmlTag = "ModuleSurfaceArea/Protocols/ProtocolNotify"
    XmlProtocolList += XmlList(XmlMsa, XmlTag)

    return map(LoadGuidProtocolPpiCommon, XmlProtocolList)


## Load a list of Module Ppis.
#
# Read an input Module XML DOM object and return a list of Ppis
# contained in the DOM object.
#
# @param  XmlMsa               An XML DOM object read from MSA file.
#
# @retvel Ppis                 A list of Ppis loaded from XmlMsa.
#
def LoadModulePpis(XmlMsa):
    XmlTag = "ModuleSurfaceArea/PPIs/Ppi"
    XmlPpiList = XmlList(XmlMsa, XmlTag)
    
    XmlTag = "ModuleSurfaceArea/PPIs/PpiNotify"
    XmlPpiList += XmlList(XmlMsa, XmlTag)
    
    return map(LoadGuidProtocolPpiCommon, XmlPpiList)


## Load a new Module Event class object.
#
# Read an input XML Event DOM object and return an object of Event
# contained in the DOM object.
#
# @param  XmlEvent             A child XML DOM object in Module XML DOM.
# @param  Type                 Specify the event type: SIGNAL_EVENT or CREATE_EVENT.
#
# @retvel ModuleEvent          A new Event object created by XmlEvent.
#
def LoadModuleEvent(XmlEvent, Type):
    ModuleEvent = ModuleEventClass()
    
    XmlTag = "EventTypes/EventType"
    ModuleEvent.CName = XmlElement(XmlEvent, XmlTag)
    
    XmlTag = "EventGuidCName"
    ModuleEvent.GuidCName = XmlAttribute(XmlEvent, XmlTag)
    
    ModuleEvent.Type = Type
    
    SetCommon(ModuleEvent, XmlEvent)
    
    return ModuleEvent
    

## Load a list of Module Events.
#
# Read an input Module XML DOM object and return a list of Events
# contained in the DOM object.
#
# @param  XmlMsa               An XML DOM object read from MSA file.
#
# @retvel Events               A list of Events loaded from XmlMsa.
#
def LoadModuleEvents(XmlMsa):
    ModuleEvents = []
    
    XmlTag = "ModuleSurfaceArea/Events/CreateEvents/EventTypes"
    for XmlCreateEvent in XmlList(XmlMsa, XmlTag):
        ModuleEvent = LoadModuleEvent(XmlCreateEvent, "CREATE_EVENT")
        ModuleEvents.append(ModuleEvent)

    XmlTag = "ModuleSurfaceArea/Events/SignalEvents/EventTypes"
    for XmlCreateEvent in XmlList(XmlMsa, XmlTag):
        ModuleEvent = LoadModuleEvent(XmlCreateEvent, "SIGNAL_EVENT")
        ModuleEvents.append(ModuleEvent)

    return ModuleEvents


## Load a new Module Hob class object.
#
# Read an input XML Hob DOM object and return an object of Hob
# contained in the DOM object.
#
# @param  XmlHob               A child XML DOM object in Module XML DOM.
#
# @retvel ModuleHob            A new Hob object created by XmlHob.
#
def LoadModuleHob(XmlHob):
    ModuleHob = ModuleHobClass()
    
    XmlTag = "HobTypes/HobType"
    ModuleHob.Type = XmlElement(XmlHob, XmlTag)
    
    XmlTag = "HobGuidCName"
    ModuleHob.GuidCName = XmlAttribute(XmlHob, XmlTag)
    
    SetCommon(ModuleHob, XmlHob)
    
    return ModuleHob


## Load a list of Module Hobs.
#
# Read an input Module XML DOM object and return a list of Hobs
# contained in the DOM object.
#
# @param  XmlMsa               An XML DOM object read from MSA file.
#
# @retvel Hobs                 A list of Hobs loaded from XmlMsa.
#
def LoadModuleHobs(XmlMsa):
    XmlTag = "ModuleSurfaceArea/Hobs/HobTypes"
    return map(LoadModuleHob, XmlList(XmlMsa, XmlTag))


## Load a new Module Variable class object.
#
# Read an input XML Variable DOM object and return an object of Variable
# contained in the DOM object.
#
# @param  XmlVariable          A child XML DOM object in Module XML DOM.
#
# @retvel ModuleVariable       A new Variable object created by XmlVariable.
#
def LoadModuleVariable(XmlVariable):
    ModuleVariable = ModuleVariableClass()
    
    XmlTag = "Variable/VariableName"
    HexWordArray = XmlElement(XmlVariable, XmlTag).split()
    try:
        ModuleVariable.Name = "".join([unichr(int(a, 16)) for a in HexWordArray])
    except:
        ModuleVariable.Name = ""
        
    XmlTag = "Variable/GuidC_Name"
    ModuleVariable.GuidCName = XmlElement(XmlVariable, XmlTag)
    
    SetCommon(ModuleVariable, XmlVariable)
    
    return ModuleVariable


## Load a list of Module Variables.
#
# Read an input Module XML DOM object and return a list of Variables
# contained in the DOM object.
#
# @param  XmlMsa               An XML DOM object read from MSA file.
#
# @retvel Variables            A list of Variables loaded from XmlMsa.
#
def LoadModuleVariables(XmlMsa):
    XmlTag = "ModuleSurfaceArea/Variables/Variable"
    return map(LoadModuleVariable, XmlList(XmlMsa, XmlTag))


## Load a new Module Boot Mode class object.
#
# Read an input XML BootMode DOM object and return an object of Boot Mode
# contained in the DOM object.
#
# @param  XmlBootMode          A child XML DOM object in Module XML DOM.
#
# @retvel ModuleBootMode       A new Boot Mode object created by XmlBootMode.
#
def LoadModuleBootMode(XmlBootMode):
    ModuleBootMode = ModuleBootModeClass()
    
    XmlTag = "BootModeName"
    ModuleBootMode.Name = XmlAttribute(XmlBootMode, XmlTag)
    
    SetCommon(ModuleBootMode, XmlBootMode)
    
    return ModuleBootMode


## Load a list of Module Boot Modes.
#
# Read an input Module XML DOM object and return a list of Boot Modes
# contained in the DOM object.
#
# @param  XmlMsa               An XML DOM object read from MSA file.
#
# @retvel BootModes            A list of Boot Modes loaded from XmlMsa.
#
def LoadModuleBootModes(XmlMsa):
    XmlTag = "ModuleSurfaceArea/BootModes/BootMode"
    return map(LoadModuleBootMode, XmlList(XmlMsa, XmlTag))


## Load a new Module System Table class object.
#
# Read an input XML SystemTable DOM object and return an object of System Table
# contained in the DOM object.
#
# @param  XmlSystemTable       A child XML DOM object in Module XML DOM.
#
# @retvel ModuleSystemTable    A new System Table object created by XmlSystemTable.
#
def LoadModuleSystemTable(XmlSystemTable):
    ModuleSystemTable = ModuleSystemTableClass()
    
    XmlTag = "SystemTable/SystemTableCName"
    ModuleSystemTable.CName = XmlElement(XmlSystemTable, XmlTag)
    
    SetCommon(ModuleSystemTable, XmlSystemTable)
    
    return ModuleSystemTable
    

## Load a list of Module System Tables.
#
# Read an input Module XML DOM object and return a list of System Tables
# contained in the DOM object.
#
# @param  XmlMsa               An XML DOM object read from MSA file.
#
# @retvel SystemTables         A list of System Tables loaded from XmlMsa.
#
def LoadModuleSystemTables(XmlMsa):
    XmlTag = "ModuleSurfaceArea/SystemTables/SystemTableCNames"
    return map(LoadModuleSystemTable, XmlList(XmlMsa, XmlTag))


## Load a new Module Data Hub class object.
#
# Read an input XML DataHub DOM object and return an object of Data Hub
# contained in the DOM object.
#
# @param  XmlDataHub           A child XML DOM object in Module XML DOM.
#
# @retvel ModuleDataHub        A new Data Hub object created by XmlDataHub.
#
def LoadModuleDataHub(XmlDataHub):
    ModuleDataHub = ModuleDataHubClass()
    
    XmlTag = "DataHub/DataHubCName"
    ModuleDataHub.CName = XmlElement(XmlDataHub, "DataHubCName")
    
    SetCommon(ModuleDataHub, XmlDataHub)

    return ModuleDataHub


## Load a list of Module Data Hubs.
#
# Read an input Module XML DOM object and return a list of Data Hubs
# contained in the DOM object.
#
# @param  XmlMsa               An XML DOM object read from MSA file.
#
# @retvel DataHubs             A list of Data Hubs loaded from XmlMsa.
#
def LoadModuleDataHubs(XmlMsa):
    XmlTag = "ModuleSurfaceArea/DataHubs/DataHubRecord"
    return map(LoadModuleDataHub, XmlList(XmlMsa, XmlTag))


## Load a new Module Hii Package class object.
#
# Read an input XML HiiPackage DOM object and return an object of Hii Package
# contained in the DOM object.
#
# @param  XmlHiiPackage        A child XML DOM object in Module XML DOM.
#
# @retvel ModuleHiiPackage     A new Hii Package object created by XmlHiiPackage.
#
def LoadModuleHiiPackage(XmlHiiPackage):
    ModuleHiiPackage = ModuleHiiPackageClass()

    XmlTag = "HiiPackage/HiiPackageCName"
    ModuleHiiPackage.CName = XmlElement(XmlHiiPackage, "HiiCName")

    SetCommon(ModuleHiiPackage, XmlHiiPackage)

    return ModuleHiiPackage


## Load a list of Module Hii Packages.
#
# Read an input Module XML DOM object and return a list of Hii Packages
# contained in the DOM object.
#
# @param  XmlMsa               An XML DOM object read from MSA file.
#
# @retvel HiiPackages          A list of Hii Packages loaded from XmlMsa.
#
def LoadModuleHiiPackages(XmlMsa):
    XmlTag = "ModuleSurfaceArea/HiiPackages/HiiPackage"
    return map(LoadModuleHiiPackage, XmlList(XmlMsa, XmlTag))


## Load a list of Module Guids.
#
# Read an input Module XML DOM object and return a list of Guids
# contained in the DOM object.
#
# @param  XmlMsa               An XML DOM object read from MSA file.
#
# @retvel Guids                A list of Guids loaded from XmlMsa.
#
def LoadModuleGuids(XmlMsa):
    XmlTag = "ModuleSurfaceArea/Guids/GuidCNames"
    return map(LoadGuidProtocolPpiCommon, XmlList(XmlMsa, XmlTag))


## Load a list of Module Pcd Codes.
#
# Read an input Module XML DOM object and return a list of Pcd Codes
# contained in the DOM object.
#
# @param  XmlMsa               An XML DOM object read from MSA file.
#
# @retvel PcdCodes             A list of Pcd Codes loaded from XmlMsa.
#
def LoadModulePcdCodes(XmlMsa):
    XmlTag = "ModuleSurfaceArea/PcdCoded/PcdEntry"
    return map(LoadPcd, XmlList(XmlMsa, XmlTag))


## Load a list of Module Extern Images.
#
# Read an input Module XML DOM object and return a list of Extern Images
# contained in the DOM object.
#
# @param  XmlMsa               An XML DOM object read from MSA file.
#
# @retvel ExternImages         A list of Extern Images loaded from XmlMsa.
#
def LoadModuleExternImages(XmlMsa):
    ModuleExternImages = []
    
    XmlTag = "ModuleSurfaceArea/Externs/Extern"
    for XmlExtern in XmlList(XmlMsa, XmlTag):
        XmlTag = "Extern/ModuleEntryPoint"
        ModuleEntryPoint = XmlElement(XmlExtern, XmlTag)
        XmlTag = "Extern/ModuleUnloadImage"
        ModuleUnloadImage = XmlElement(XmlExtern, XmlTag)
        if ModuleEntryPoint == "" and ModuleUnloadImage == "":
            continue

        ModuleExtern = ModuleExternImageClass()
        ModuleExtern.ModuleEntryPoint = ModuleEntryPoint
        ModuleExtern.ModuleUnloadImage = ModuleUnloadImage
        ModuleExternImages.append(ModuleExtern)

    return ModuleExternImages


## Load a list of Module Extern Libraries.
#
# Read an input Module XML DOM object and return a list of Extern Libraries
# contained in the DOM object.
#
# @param  XmlMsa               An XML DOM object read from MSA file.
#
# @retvel ExternLibraries      A list of Extern Libraries loaded from XmlMsa.
#
def LoadModuleExternLibraries(XmlMsa):
    ModuleExternLibraries = []
    
    XmlTag = "ModuleSurfaceArea/Externs/Extern"
    for XmlExtern in XmlList(XmlMsa, XmlTag):
        XmlTag = "Extern/Constructor"
        Constructor = XmlElement(XmlExtern, XmlTag)
        XmlTag = "Extern/Destructor"
        Destructor = XmlElement(XmlExtern, XmlTag)
        if Constructor == "" and Destructor == "":
            continue
        
        ModuleExtern = ModuleExternLibraryClass()
        ModuleExtern.Constructor = Constructor
        ModuleExtern.Destructor = Destructor
        ModuleExternLibraries.append(ModuleExtern)

    return ModuleExternLibraries


## Load a list of Module Extern Drivers.
#
# Read an input Module XML DOM object and return a list of Extern Drivers
# contained in the DOM object.
#
# @param  XmlMsa               An XML DOM object read from MSA file.
#
# @retvel ExternDrivers        A list of Extern Drivers loaded from XmlMsa.
#
def LoadModuleExternDrivers(XmlMsa):
    ModuleExternDrivers = []
    
    XmlTag = "ModuleSurfaceArea/Externs/Extern"
    for XmlExtern in XmlList(XmlMsa, XmlTag):
        XmlTag = "Extern/DriverBinding"
        DriverBinding = XmlElement(XmlExtern, XmlTag)
        XmlTag = "Extern/ComponentName"
        ComponentName = XmlElement(XmlExtern, XmlTag)
        XmlTag = "Extern/DriverConfig"
        DriverConfig = XmlElement(XmlExtern, XmlTag)
        XmlTag = "Extern/DriverDiag"
        DriverDiag = XmlElement(XmlExtern, XmlTag)
        if DriverBinding == "":
            continue
        
        ModuleExtern = ModuleExternDriverClass()
        ModuleExtern.DriverBinding = DriverBinding
        ModuleExtern.ComponentName = ComponentName
        ModuleExtern.DriverConfig = DriverConfig
        ModuleExtern.DriverDiag = DriverDiag
        ModuleExternDrivers.append(ModuleExtern)

    return ModuleExternDrivers


## Load a list of Module Extern Call Backs.
#
# Read an input Module XML DOM object and return a list of Extern Call Backs
# contained in the DOM object.
#
# @param  XmlMsa               An XML DOM object read from MSA file.
#
# @retvel ExternCallBacks      A list of Extern Call Backs loaded from XmlMsa.
#
def LoadModuleExternCallBacks(XmlMsa):
    ModuleExternCallBacks = []
    
    XmlTag = "ModuleSurfaceArea/Externs/Extern"
    for XmlExtern in XmlList(XmlMsa, XmlTag):
        XmlTag = "Extern/SetVirtualAddressMapCallBack"
        SetVirtualAddressMap = XmlElement(XmlExtern, XmlTag)
        XmlTag = "Extern/ExitBootServicesCallBack"
        ExitBootServices = XmlElement(XmlExtern, XmlTag)
        if SetVirtualAddressMap == "" and ExitBootServices == "":
            continue
        
        ModuleExtern = ModuleExternCallBackClass()
        ModuleExtern.ExitBootServicesCallBack = ExitBootServices
        ModuleExtern.SetVirtualAddressMapCallBack = SetVirtualAddressMap
        ModuleExternCallBacks.append(ModuleExtern)

    return ModuleExternCallBacks


## Load a list of Module Build Options.
#
# Read an input Module XML DOM object and return a list of Build Options
# contained in the DOM object.
#
# @param  XmlMsa               An XML DOM object read from MSA file.
#
# @retvel BuildOptions         A list of Build Options loaded from XmlMsa.
#
def LoadModuleBuildOptions(XmlMsa):
    XmlTag = "ModuleSurfaceArea/ModuleBuildOptions/Options/Option"
    return map(LoadBuildOption, XmlList(XmlMsa, XmlTag))


## Load a list of Module User Extensions.
#
# Read an input Module XML DOM object and return a list of User Extensions
# contained in the DOM object.
#
# @param  XmlMsa               An XML DOM object read from MSA file.
#
# @retvel UserExtensions       A list of User Extensions loaded from XmlMsa.
#
def LoadModuleUserExtensions(XmlMsa):
    XmlTag = "ModuleSurfaceArea/UserExtensions"
    return map(LoadUserExtensions, XmlList(XmlMsa, XmlTag))

## Load a new Module class object.
#
# Read an input MSA File and return a new Module class Object.
#
# @param  MsaFileName          An XML DOM object read from MSA file.
#
# @retvel Module               A new Module class object loaded from MSA File.
#
def LoadMsa(MsaFileName):
    XmlMsa = XmlParseFile(MsaFileName)
    EdkLogger.verbose("Load MSA File: %s" % MsaFileName)
    
    Module = ModuleClass()
    Module.Header = LoadModuleHeader(XmlMsa, MsaFileName)
    Module.LibraryClasses = LoadModuleLibraryClasses(XmlMsa)
    Module.Sources = LoadModuleSources(XmlMsa)
    Module.BinaryFiles = LoadModuleBinaries(XmlMsa)
    Module.NonProcessedFiles = LoadModuleNonProcessedFiles(XmlMsa)
    Module.PackageDependencies = LoadModulePackageDependencies(XmlMsa)
    Module.Protocols = LoadModuleProtocols(XmlMsa)
    Module.Ppis = LoadModulePpis(XmlMsa)
    Module.Events = LoadModuleEvents(XmlMsa)
    Module.Hobs = LoadModuleHobs(XmlMsa)
    Module.Variables = LoadModuleVariables(XmlMsa)
    Module.BootModes = LoadModuleBootModes(XmlMsa)
    Module.SystemTables = LoadModuleSystemTables(XmlMsa)
    Module.DataHubs = LoadModuleDataHubs(XmlMsa)
    Module.HiiPackages = LoadModuleHiiPackages(XmlMsa)
    Module.Guids = LoadModuleGuids(XmlMsa)
    Module.PcdCodes = LoadModulePcdCodes(XmlMsa)
    Module.ExternImages = LoadModuleExternImages(XmlMsa)
    Module.ExternLibraries = LoadModuleExternLibraries(XmlMsa)
    Module.ExternDrivers = LoadModuleExternDrivers(XmlMsa)
    Module.ExternCallBacks = LoadModuleExternCallBacks(XmlMsa)
    Module.BuildOptions = LoadModuleBuildOptions(XmlMsa)
    Module.UserExtensions = LoadModuleUserExtensions(XmlMsa)
    
    return Module


# This acts like the main() function for the script, unless it is 'import'ed
# into another script.
if __name__ == '__main__':
    pass