## @file
# Open an SPD file and load all its contents to a PackageClass 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 Common.XmlRoutines import *
from Common.MigrationUtilities import *
from CommonDataClass.PackageClass import *


## Load a list of Package Cloned Records.
#
# Read an input Package XML DOM object and return a list of Cloned Records
# contained in the DOM object.
#
# @param  XmlSpd               An XML DOM object read from SPD file.
#
# @retvel ClonedRecords        A list of Cloned Records loaded from XmlSpd.
#
def LoadPackageClonedRecords(XmlSpd):
    XmlTag = "PackageSurfaceArea/PackageDefinitions/ClonedFrom/Cloned"
    return map(LoadClonedRecord, XmlList(XmlSpd, XmlTag))


## Load Package Header.
#
# Read an input Package XML DOM object and return Package Header class object
# contained in the DOM object.
#
# @param  XmlSpd               An XML DOM object read from SPD file.
# @param  SpdFileName          The file path of SPD File.
#
# @retvel PackageHeader        A new Package Header object loaded from XmlSpd.
#
def LoadPackageHeader(XmlSpd, SpdFileName):
    PackageHeader = PackageHeaderClass()
    
    XmlTag = "PackageSurfaceArea/SpdHeader"
    SpdHeader = XmlNode(XmlSpd, XmlTag)
    
    SetIdentification(PackageHeader, SpdHeader, "PackageName", SpdFileName)
    SetCommonHeader(PackageHeader, SpdHeader)
    
    XmlTag = "PackageSurfaceArea/PackageDefinitions/ReadOnly"
    if XmlElement(XmlSpd, XmlTag).lower() == "true":
        PackageHeader.ReadOnly = True

    XmlTag = "PackageSurfaceArea/PackageDefinitions/RePackage"
    if XmlElement(XmlSpd, XmlTag).lower() == "true":
        PackageHeader.RePackage = True

    PackageHeader.ClonedFrom = LoadPackageClonedRecords(XmlSpd)
    
    return PackageHeader


## Load a list of Package Library Classes.
#
# Read an input Package XML DOM object and return a list of Library Classes
# contained in the DOM object.
#
# @param  XmlSpd               An XML DOM object read from SPD file.
#
# @retvel LibraryClasses       A list of Library Classes loaded from XmlSpd.
#
def LoadPackageLibraryClasses(XmlSpd):
    XmlTag = "PackageSurfaceArea/LibraryClassDeclarations/LibraryClass"
    return map(LoadLibraryClass, XmlList(XmlSpd, XmlTag))


## Load a new Package Industry Std Header class object.
#
# Read an input XML IndustryStdHeader DOM object and return an object of
# Industry Std Header contained in the DOM object.
#
# @param  XmlIndustryStdHeader     A child XML DOM object in Package XML DOM.
#
# @retvel PackageIndustryStdHeader A new Industry Std Header object created by XmlIndustryStdHeader.
#
def LoadPackageIndustryStdHeader(XmlIndustryStdHeader):
    PackageIndustryStdHeader = PackageIndustryStdHeaderClass()
    
    XmlTag = "Name"
    Name = XmlAttribute(XmlIndustryStdHeader, XmlTag)
    PackageIndustryStdHeader.Name = Name
    
    XmlTag = "IndustryStdHeader/IncludeHeader"
    IncludeHeader = XmlElement(XmlIndustryStdHeader, XmlTag)
    PackageIndustryStdHeader.IncludeHeader = IncludeHeader
    
    SetCommon(PackageIndustryStdHeader, XmlIndustryStdHeader)
    
    return PackageIndustryStdHeader


## Load a list of Package Industry Std Headers.
#
# Read an input Package XML DOM object and return a list of Industry Std Headers
# contained in the DOM object.
#
# @param  XmlSpd             An XML DOM object read from SPD file.
#
# @retvel IndustryStdHeaders A list of Industry Std Headers loaded from XmlSpd.
#
def LoadPackageIndustryStdHeaders(XmlSpd):
    XmlTag = "PackageSurfaceArea/IndustryStdIncludes/IndustryStdHeader"
    return map(LoadPackageIndustryStdHeader, XmlList(XmlSpd, XmlTag))


## Load a list of Package Module Files.
#
# Read an input Package XML DOM object and return a list of Module Files
# contained in the DOM object.
#
# @param  XmlSpd             An XML DOM object read from SPD file.
#
# @retvel ModuleFiles        A list of Module Files loaded from XmlSpd.
#
def LoadPackageModuleFiles(XmlSpd):
    XmlTag = "PackageSurfaceArea/MsaFiles/Filename"
    return XmlElementList(XmlSpd, XmlTag)


## Load a new Package Include Pkg Header class object.
#
# Read an input XML IncludePkgHeader DOM object and return an object of Include
# Package Header contained in the DOM object.
#
# @param  XmlPackageIncludeHeader A child XML DOM object in Package XML DOM.
#
# @retvel PackageIncludePkgHeader A new Include Pkg Header object created by
#                                 XmlPackageIncludeHeader.
#
def LoadPackageIncludePkgHeader(XmlPackageIncludeHeader):
    PackageIncludeHeader = PackageIncludePkgHeaderClass()
    
    IncludeHeader = XmlElementData(XmlPackageIncludeHeader)
    PackageIncludeHeader.IncludeHeader = IncludeHeader
    
    XmlTag = "ModuleType"
    ModuleTypes = XmlAttribute(XmlPackageIncludeHeader, XmlTag)
    PackageIncludeHeader.ModuleType = ModuleTypes.split()
    
    return PackageIncludeHeader


## Load a list of Package Include Pkg Headers.
#
# Read an input Package XML DOM object and return a list of Include Pkg Headers
# contained in the DOM object.
#
# @param  XmlSpd               An XML DOM object read from SPD file.
#
# @retvel IncludePkgHeaders    A list of Include Pkg Headers loaded from XmlSpd.
#
def LoadPackageIncludePkgHeaders(XmlSpd):
    XmlTag = "PackageSurfaceArea/PackageHeaders/IncludePkgHeader"
    return map(LoadPackageIncludePkgHeader, XmlList(XmlSpd, XmlTag))


## Load a list of Package Guid Declarations.
#
# Read an input Package XML DOM object and return a list of Guid Declarations
# contained in the DOM object.
#
# @param  XmlSpd               An XML DOM object read from SPD file.
#
# @retvel GuidDeclarations     A list of Guid Declarations loaded from XmlSpd.
#
def LoadPackageGuidDeclarations(XmlSpd):
    XmlTag = "PackageSurfaceArea/GuidDeclarations/Entry"
    return map(LoadGuidProtocolPpiCommon, XmlList(XmlSpd, XmlTag))


## Load a list of Package Protocol Declarations.
#
# Read an input Package XML DOM object and return a list of Protocol Declarations
# contained in the DOM object.
#
# @param  XmlSpd               An XML DOM object read from SPD file.
#
# @retvel ProtocolDeclarations A list of Protocol Declarations loaded from XmlSpd.
#
def LoadPackageProtocolDeclarations(XmlSpd):
    XmlTag = "PackageSurfaceArea/ProtocolDeclarations/Entry"
    return map(LoadGuidProtocolPpiCommon, XmlList(XmlSpd, XmlTag))


## Load a list of Package Ppi Declarations.
#
# Read an input Package XML DOM object and return a list of Ppi Declarations
# contained in the DOM object.
#
# @param  XmlSpd               An XML DOM object read from SPD file.
#
# @retvel PpiDeclarations      A list of Ppi Declarations loaded from XmlSpd.
#
def LoadPackagePpiDeclarations(XmlSpd):
    XmlTag = "PackageSurfaceArea/PpiDeclarations/Entry"
    return map(LoadGuidProtocolPpiCommon, XmlList(XmlSpd, XmlTag))


## Load a list of Package Pcd Declarations.
#
# Read an input Package XML DOM object and return a list of Pcd Declarations
# contained in the DOM object.
#
# @param  XmlSpd               An XML DOM object read from SPD file.
#
# @retvel PcdDeclarations      A list of Pcd Declarations loaded from XmlSpd.
#
def LoadPackagePcdDeclarations(XmlSpd):
    XmlTag = "PackageSurfaceArea/PcdDeclarations/PcdEntry"
    return map(LoadPcd, XmlList(XmlSpd, XmlTag))


## Load a list of Package User Extensions.
#
# Read an input Package XML DOM object and return a list of User Extensions
# contained in the DOM object.
#
# @param  XmlSpd               An XML DOM object read from SPD file.
#
# @retvel UserExtensions       A list of User Extensions loaded from XmlSpd.
#
def LoadPackageUserExtensions(XmlSpd):
    XmlTag = "PackageSurfaceArea/UserExtensions"
    return map(LoadUserExtensions, XmlList(XmlSpd, XmlTag))


## Load a new Package class object.
#
# Read an input SPD File and return a new Package class Object.
#
# @param  SpdFileName          An XML DOM object read from SPD file.
#
# @retvel Package              A new Module class object loaded from SPD File.
#
def LoadSpd(SpdFileName):
    XmlSpd = XmlParseFile(SpdFileName)
    EdkLogger.verbose("Xml Object loaded for file %s" % SpdFileName)

    Package = PackageClass()
    Package.Header = LoadPackageHeader(XmlSpd, SpdFileName)
    Package.LibraryClassDeclarations = LoadPackageLibraryClasses(XmlSpd)
    Package.IndustryStdHeaders = LoadPackageIndustryStdHeaders(XmlSpd)
    Package.ModuleFiles = LoadPackageModuleFiles(XmlSpd)
    Package.PackageIncludePkgHeaders = LoadPackageIncludePkgHeaders(XmlSpd)
    Package.GuidDeclarations = LoadPackageGuidDeclarations(XmlSpd)
    Package.ProtocolDeclarations = LoadPackageProtocolDeclarations(XmlSpd)
    Package.PpiDeclarations = LoadPackagePpiDeclarations(XmlSpd)
    Package.PcdDeclarations = LoadPackagePcdDeclarations(XmlSpd)
    Package.UserExtensions = LoadPackageUserExtensions(XmlSpd)
    
    return Package


# This acts like the main() function for the script, unless it is 'import'ed
# into another script.
if __name__ == '__main__':
    pass
