## @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