## @file
# Open an FPD file and load all its contents to a PlatformClass 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.PlatformClass import *
from CommonDataClass.FdfClass import *
from Common.XmlRoutines import *
from Common.MigrationUtilities import *
from EdkIIWorkspaceGuidsInfo import gEdkIIWorkspaceGuidsInfo

## Load Platform Header
#
# Read an input Platform XML DOM object and return Platform Header class object
# contained in the DOM object.
#
# @param  XmlFpd                An XML DOM object read from FPD file
# @param  FpdFileName           The file path of FPD File
#
# @retvel  PlatformHeader       A new Platform Header object loaded from XmlFpd
#
def LoadPlatformHeader(XmlFpd, FpdFileName):
    PlatformHeader = PlatformHeaderClass()
    
    XmlTag = "PlatformSurfaceArea/PlatformHeader"
    FpdHeader = XmlNode(XmlFpd, XmlTag)
    
    SetIdentification(PlatformHeader, FpdHeader, "PlatformName", FpdFileName)
    SetCommonHeader(PlatformHeader, FpdHeader)

    XmlTag = "PlatformSurfaceArea/PlatformHeader/Specification"
    List = XmlElement(XmlFpd, XmlTag).split()
    SpecificationName = List[0]
    SpecificationValue = List[1]
    PlatformHeader.Specification = {SpecificationName:SpecificationValue}
    
    XmlTag = "PlatformSurfaceArea/PlatformDefinitions/SupportedArchitectures"
    PlatformHeader.SupArchList = XmlElement(XmlFpd, XmlTag).split()

    XmlTag = "PlatformSurfaceArea/PlatformDefinitions/BuildTargets"
    PlatformHeader.BuildTargets = XmlElement(XmlFpd, XmlTag).split()

    XmlTag = "PlatformSurfaceArea/PlatformDefinitions/IntermediateDirectories"
    PlatformHeader.IntermediateDirectories = XmlElement(XmlFpd, XmlTag)
    
    XmlTag = "PlatformSurfaceArea/PlatformDefinitions/OutputDirectory"
    PlatformHeader.OutputDirectory = XmlElement(XmlFpd, XmlTag)

    XmlTag = "PlatformSurfaceArea/PlatformDefinitions/SkuInfo"
    List = map(LoadSkuId, XmlList(XmlFpd, XmlTag))
    if List != []:
        PlatformHeader.SkuIdName = List[0]
    
    return PlatformHeader

## Load a Platform SkuId
#
# Read an input Platform XML DOM object and return a list of Platform SkuId
# contained in the DOM object.
#
# @param    XmlPlatformSkuInfo     An XML DOM object read from FPD file
#
# @retvel   PlatformSkuInfo        A SkuInfo loaded from XmlFpd
#
def LoadPlatformSkuInfo(XmlPlatformSkuInfo):
    XmlTag = "SkuInfo/SkuId"
    SkuInfo = []
    SkuId = XmlElement(XmlPlatformSkuInfo, XmlTag)
    SkuInfo.append(SkuId)
    
    XmlTag = "SkuInfo/Value"
    Value = XmlElement(XmlPlatformSkuInfo, XmlTag)
    SkuInfo.append(Value)
    return SkuInfo

## Load a Platform SkuId
#
# Read an input Platform XML DOM object and return a list of Platform SkuId
# contained in the DOM object.
#
# @param    XmlSkuInfo     An XML DOM object read from FPD file
#
# @retvel   List           A list of SkuId and SkuValue loaded from XmlFpd
#
def LoadSkuId(XmlSkuInfo):
    XmlTag = "SkuInfo/UiSkuName"
    SkuValue = XmlElement(XmlSkuInfo, XmlTag)
    
    XmlTag = "SkuInfo/UiSkuName"
    List = map(LoadSkuID, XmlList(XmlSkuInfo, XmlTag))
    if List != []:
        SkuID = List[0]
    #SkuID = XmlAttribute(XmlSkuInfo, XmlTag)
    List = []
    List.append(SkuID)
    List.append(SkuValue)
    return List

def LoadSkuID(XmlUiSkuName):
    XmlTag = "SkuID"
    SkuID = XmlAttribute(XmlUiSkuName, XmlTag)
    return SkuID

## Load a list of Platform SkuIds
#
# Read an input Platform XML DOM object and return a list of Platform SkuId
# contained in the DOM object.
#
# @param    XmlFpd                 An XML DOM object read from FPD file
#
# @retvel   PlatformSkuIds         A platform SkuIds object loaded from XmlFpd
#
def LoadPlatformSkuInfos(XmlFpd):
    PlatformSkuIds = SkuInfoListClass()

    SkuInfoList = []
    
    XmlTag = "PlatformSurfaceArea/PlatformDefinitions/SkuInfo"
    List = map(LoadSkuId, XmlList(XmlFpd, XmlTag))
    SkuInfoList = List
    
    XmlTag = "PlatformSurfaceArea/PlatformDefinitions/SkuInfo/UiSkuName"
    Value = XmlElement(XmlFpd, XmlTag)
    
    XmlTag = "PlatformSurfaceArea/DynamicPcdBuildDefinitions/PcdBuildData/SkuInfo"
    # here return a List
    List = map(LoadPlatformSkuInfo, XmlList(XmlFpd, XmlTag))

    for SkuInfo in List:
        SkuId = SkuInfo[0]
        Value = SkuInfo[1]

        SkuInfoList.append(SkuInfo)

    PlatformSkuIds.SkuInfoList = SkuInfoList

    return PlatformSkuIds

## Load Platform Module Build Option
#
# Read an input Platform XML DOM object and return Platform Module Build Option class object
# contained in the DOM object.
#
# @param    XmlModuleBuildOption            An XML DOM object read from FPD file
#
# @retvel   PlatformBuildOption             A Platform Build Option object loaded from XmlFpd
#
def LoadModuleBuildOption(XmlModuleBuildOption):
    PlatformBuildOption = PlatformBuildOptionClass()
    PlatformBuildOption.UserDefinedAntTasks = {}
    
    XmlTag = "BuildOptions/Options/Option"
    PlatformBuildOption.Options = map(LoadBuildOption, XmlList(XmlModuleBuildOption, XmlTag))
    
    PlatformBuildOption.UserExtensions = {}
    PlatformBuildOption.FfsKeyList = {}
    return PlatformBuildOption

## Load Platform Module Extern
#
# Read an input Platform XML DOM object and return Platform Module Extern class object
# contained in the DOM object.
#
# @param    XmlModuleExtern                  An XML DOM object read from FPD file
#
# @retvel   PlatformModuleExtern             A Platform Module Extern object loaded from XmlFpd
#
def LoadModuleExtern(XmlModuleExtern):
    PlatformModuleExtern = []
    
    XmlTag = "Externs/PcdIsDriver"
    PcdIsDriver = XmlElement(XmlModuleExtern, XmlTag)
    PlatformModuleExtern.append(PcdIsDriver)
    
    XmlTag = "Externs/Specification"
    Specification = XmlElement(XmlModuleExtern, XmlTag)
    PlatformModuleExtern.append(Specification)
    
    XmlTag = "Externs/Extern"

    return PlatformModuleExtern

## Load Platform ModuleSaBuildOptions
#
# Read an input Platform XML DOM object and return Platform ModuleSaBuildOptions class object
# contained in the DOM object.
#
# @param    XmlModuleSaBuildOptions            An XML DOM object read from FPD file
#
# @retvel   PlatformBuildOptions               A list of Platform ModuleSaBuildOption object loaded from XmlFpd
#
def LoadPlatformModuleSaBuildOption(XmlModuleSA):
    PlatformModuleSaBuildOption = PlatformBuildOptionClasses()
    
    XmlTag = "ModuleSA/ModuleSaBuildOptions/FvBinding"
    PlatformModuleSaBuildOption.FvBinding = XmlElement(XmlModuleSA, XmlTag)
    
    XmlTag = "ModuleSA/ModuleSaBuildOptions/FfsFormatKey"
    PlatformModuleSaBuildOption.FfsFormatKey = XmlElement(XmlModuleSA, XmlTag)
    
    XmlTag = "ModuleSA/ModuleSaBuildOptions/FfsFileNameGuid"
    PlatformModuleSaBuildOption.FfsFileNameGuid = XmlElement(XmlModuleSA, XmlTag)
    
    XmlTag = "ModuleSA/ModuleSaBuildOptions/Options/Option"
    PlatformModuleSaBuildOption.BuildOptionList = map(LoadBuildOption, XmlList(XmlModuleSA, XmlTag))

    return PlatformModuleSaBuildOption

## Load a list of Platform Library Classes
#
# Read an input Platform XML DOM object and return a list of Library Classes
# contained in the DOM object.
#
# @param  XmlLibraryInstance       An XML DOM object read from FPD file
#
# @retvel  LibraryInstance         A Library Instance loaded from XmlFpd
#
def LoadPlatformModuleLibraryInstance(XmlLibraryInstance):
    LibraryInstance = []

    XmlTag = "ModuleGuid"
    ModuleGuid = XmlAttribute(XmlLibraryInstance, XmlTag)
    
    ModulePath = gEdkIIWorkspaceGuidsInfo.ResolveModuleFilePath(ModuleGuid)
    ModuleMSAFile = ModulePath.replace('.inf', '.msa')
    WorkSpace = os.getenv('WORKSPACE')
    ModuleMSAFileName = os.path.join(WorkSpace, ModuleMSAFile)
    XmlMsa = XmlParseFile(ModuleMSAFileName)
    
    XmlTag = "ModuleSurfaceArea/LibraryClassDefinitions/LibraryClass/Keyword"
    Name = XmlElement(XmlMsa, XmlTag)
    LibraryInstance.append(Name)
    LibraryInstance.append(ModulePath)
    
    #XmlTag = "PackageGuid"
    #PackageGuid = XmlAttribute(XmlLibraryInstance, XmlTag)
    #LibraryInstance.append(PackageGuid)
    return LibraryInstance

## Load a Library Class
#
# Read an input Platform XML DOM object and return a library class object
# contained in the DOM object.
#
# @param    XmlLibraryClass       An XML DOM object read from FPD file
#
# @retvel   SupModuleList         A Library Class Supported Module List object loaded from XmlFpd
#
def LoadLibraryClassSupModuleList(XmlLibraryClass):
    XmlTag = "Usage"
    Usage = XmlAttribute(XmlLibraryClass, XmlTag)
    if Usage == "ALWAYS_PRODUCED":
        XmlTag = "SupModuleList"
        SupModuleList = XmlAttribute(XmlLibraryClass, XmlTag).split()
        return SupModuleList
        
## Load Platform Library Class
#
# Read an input Platform XML DOM object and return Platform module class object
# contained in the DOM object.
#
# @param    XmlLibraries             An XML DOM object read from FPD file
#
# @retvel   PlatformLibraryClass     A Platform Library Class object loaded from XmlFpd
#
def LoadPlatformLibraryClass(XmlPlatformLibraryClass):
    PlatformLibraryInstance = PlatformLibraryClass()

    XmlTag = "ModuleGuid"
    LibraryInstanceModuleGuid = XmlAttribute(XmlPlatformLibraryClass, XmlTag)
    
    XmlTag = "PackageGuid"
    LibraryInstancePackageGuid = XmlAttribute(XmlPlatformLibraryClass, XmlTag)
    
    LibraryInstancePath = gEdkIIWorkspaceGuidsInfo.ResolveModuleFilePath(LibraryInstanceModuleGuid)
    
    if LibraryInstancePath != "": # if LibraryInstancePath == "" that's because the module guid cannot be resolved
        PlatformLibraryInstance.FilePath = LibraryInstancePath
        # replace *.inf to *.msa
        LibraryInstanceMSAName = LibraryInstancePath.replace('.inf', '.msa')
        WorkSpace = os.getenv('WORKSPACE')
        LibraryInstanceMSAPath = os.path.join(WorkSpace, LibraryInstanceMSAName)
        
        PlatformLibraryInstance.FilePath = LibraryInstancePath
    
        XmlMsa = XmlParseFile(LibraryInstanceMSAPath)

        XmlTag = "ModuleSurfaceArea/MsaHeader/ModuleName"
        PlatformLibraryInstance.Name = XmlElement(XmlMsa, XmlTag)
    
        XmlTag = "ModuleSurfaceArea/MsaHeader/ModuleType"
        PlatformLibraryInstance.ModuleType = XmlElement(XmlMsa, XmlTag)
    
        if PlatformLibraryInstance.ModuleType != "BASE":
            XmlTag = "ModuleSurfaceArea/LibraryClassDefinitions/LibraryClass"
            List = map(LoadLibraryClassSupModuleList, XmlList(XmlMsa, XmlTag))
            if List != []:
                PlatformLibraryInstance.SupModuleList = List[0]
        XmlTag = "ModuleSurfaceArea/ModuleDefinitions/SupportedArchitectures"
        PlatformLibraryInstance.SupArchList = XmlElement(XmlMsa, XmlTag).split()
    
        PlatformLibraryInstance.ModuleGuid = LibraryInstanceModuleGuid
    
        XmlTag = "ModuleSurfaceArea/MsaHeader/Version"
        PlatformLibraryInstance.ModuleVersion = XmlElement(XmlMsa, XmlTag)
    
        PlatformLibraryInstance.PackageGuid = LibraryInstancePackageGuid
        PlatformLibraryInstance.PackageVersion = ''
    
        return PlatformLibraryInstance

## Load Platform Library Classes
#
# Read an input Platform XML DOM object and return Platform module class object
# contained in the DOM object.
#
# @param    XmlLibraries             An XML DOM object read from FPD file
#
# @retvel   PlatformLibraryClasses    A list of Platform Library Class object loaded from XmlFpd
#
def LoadPlatformLibraryClasses(XmlFpd):
    PlatformLibraryInstances = PlatformLibraryClasses()
    PlatformLibraryInstances.LibraryList = []

    List = []
    XmlTag = "PlatformSurfaceArea/FrameworkModules/ModuleSA/Libraries/Instance"
    List = map(LoadPlatformLibraryClass, XmlList(XmlFpd, XmlTag))
    #List.sort()
    if List == []:
        print "Error"
    else:
        PlatformLibraryInstances.LibraryList = List
    
    return PlatformLibraryInstances

## Load Platform module
#
# Read an input Platform XML DOM object and return Platform module class object
# contained in the DOM object.
#
# @param    XmlModuleSA            An XML DOM object read from FPD file
#
# @retvel   PlatformModule         A Platform module object loaded from XmlFpd
#
def LoadModuleSA(XmlModuleSA):
    PlatformModule = PlatformModuleClass()

    # three parts: Libraries instances, PcdBuildDefinition, ModuleSaBuildOptions
    XmlTag = "ModuleSA/Libraries/Instance"

    PlatformModule.LibraryClasses = map(LoadPlatformModuleLibraryInstance, XmlList(XmlModuleSA, XmlTag))

    XmlTag = "ModuleSA/PcdBuildDefinition/PcdData"
    PlatformModule.PcdBuildDefinitions = map(LoadPlatformPcdData, XmlList(XmlModuleSA, XmlTag))

    XmlTag = "ModuleSA/ModuleSaBuildOptions"
    PlatformModule.ModuleSaBuildOption = LoadPlatformModuleSaBuildOption(XmlModuleSA)

    XmlTag = "ModuleSA/BuildOptions"
    PlatformModule.BuildOptions = map(LoadModuleBuildOption, XmlList(XmlModuleSA, XmlTag)) #bugbug fix me
    
    XmlTag = "ModuleSA/Externs"
    PlatformModule.Externs = map(LoadModuleExtern, XmlList(XmlModuleSA, XmlTag)) #bugbug fix me
    
    XmlTag = "SupArchList"
    PlatformModule.SupArchList = XmlAttribute(XmlModuleSA, XmlTag).split()
    
    # the package guid which the module depends on, do not care for now
    XmlTag = "PackageGuid"
    PlatformModule.PackageGuid = XmlAttribute(XmlModuleSA, XmlTag)

    # the module guid, use this guid to get the module *.msa file and convert it to *.inf file with path
    XmlTag = "ModuleGuid"
    PlatformModule.ModuleGuid = XmlAttribute(XmlModuleSA, XmlTag)
    # use this guid to find the *.msa file path or FilePath $(WORKSPACE)/EdkModulePkg/Core/Dxe/DxeMain.msa
    # then convert $(WORKSPACE)/EdkModulePkg/Core/Dxe/DxeMain.msa to $(WORKSPACE)/EdkModulePkg/Core/Dxe/DxeMain.inf, it's FilePath
    PlatformModulePath = gEdkIIWorkspaceGuidsInfo.ResolveModuleFilePath(PlatformModule.ModuleGuid)

    PlatformModule.FilePath = PlatformModulePath # *.inf file path
    # *.inf back to *.msa
    ModuleMSAFileName = PlatformModulePath.replace('.inf', '.msa')
    WorkSpace = os.getenv('WORKSPACE')
    ModuleMSAFileName = os.path.join(WorkSpace, ModuleMSAFileName)
    # Open this module
    #ModuleMSA = open(ModuleMSAFileName, "r")
    XmlMsa = XmlParseFile(ModuleMSAFileName)

    XmlTag = "ModuleSurfaceArea/MsaHeader/ModuleName"
    PlatformModule.Name = XmlElement(XmlMsa, XmlTag)     # ModuleName

    XmlTag = "ModuleSurfaceArea/MsaHeader/ModuleType"
    PlatformModule.ModuleType = XmlElement(XmlMsa, XmlTag)

    # IA32, X64, IPF and EBC which the module support arch
    #XmlTag = "ModuleSurfaceArea/ModuleDefinitions/SupportedArchitectures"
    #PlatformModule.SupArchList = XmlElement(XmlMsa, XmlTag).split()

    #XmlTag = "ModuleSurfaceArea/MsaHeader/"
    PlatformModule.Type = ''     #LIBRARY | LIBRARY_CLASS | MODULE, used by dsc. New in DSC spec

    PlatformModule.ExecFilePath = '' # New in DSC spec

    XmlTag = "ModuleSurfaceArea/MsaHeader/Specification"
    PlatformModule.Specifications = XmlElement(XmlMsa, XmlTag).split()

    return PlatformModule

## Load Platform modules
#
# Read an input Platform XML DOM object and return a list of Platform modules class object
# contained in the DOM object.
#
# @param    XmlFpd                  An XML DOM object read from FPD file
#
# @retvel   PlatformModules         A list of Platform modules object loaded from XmlFpd
#
def LoadPlatformModules(XmlFpd):
    PlatformModules = PlatformModuleClasses()
    
    XmlTag = "PlatformSurfaceArea/FrameworkModules/ModuleSA"
    PlatformModules.ModuleList = map(LoadModuleSA, XmlList(XmlFpd, XmlTag))
    
    return PlatformModules

## Load Platform Flash Definition File
#
# Read an input Platform XML DOM object and return Platform Flash Definition File class object
# contained in the DOM object.
#
# @param    XmlFpd                              An XML DOM object read from FPD file
# @param    FpdFileName                         The file path of FPD File
#
# @retvel   PlatformFlashDefinitionFile         A new Platform Flash Definition File object loaded from XmlFpd
#
def LoadPlatformFlashDefinitionFile(XmlFpd, FpdFileName):
    PlatformFlashDefinitionFile = PlatformFlashDefinitionFileClass()
    
    XmlTag = "PlatformSurfaceArea/Flash/FlashDefinitionFile"
    PlatformFlashDefinitionFile.FilePath = XmlElement(XmlFpd, XmlTag)
    
    XmlTag = "PlatformSurfaceArea/Flash/FlashDefinitionFile/Id"
    PlatformFlashDefinitionFile.Id = XmlAttribute(XmlFpd, XmlTag)
    
    XmlTag = "PlatformSurfaceArea/Flash/FlashDefinitionFile/UiName"
    PlatformFlashDefinitionFile.UiName = XmlAttribute(XmlFpd, XmlTag)
    
    XmlTag = "PlatformSurfaceArea/Flash/FlashDefinitionFile/Preferred"
    PlatformFlashDefinitionFile.Preferred = XmlAttribute(XmlFpd, XmlTag)
    
    return PlatformFlashDefinitionFile

## Load Platform User Defined Ant Tasks
#
# Read an input Platform XML DOM object and return platform
# User Defined Ant Tasks contained in the DOM object.
#
# @param   XmlUserDefinedAntTasks   An XML DOM object read from FPD file
#
# @retvel  AntTask                  An Ant Task loaded from XmlFpd
#
def LoadUserDefinedAntTasks(XmlFpd):
    Dict = {}
    AntTask = PlatformAntTaskClass()

    XmlTag = "PlatformSurfaceArea/BuildOptions/UserDefinedAntTasks/AntTask/Id"
    AntTask.Id = XmlAttribute(XmlFpd, XmlTag)
    
    XmlTag = "PlatformSurfaceArea/BuildOptions/UserDefinedAntTasks/AntTask/AntCmdOptions"
    AntTask.AntCmdOptions = XmlElement(XmlFpd, XmlTag)
    
    XmlTag = "PlatformSurfaceArea/BuildOptions/UserDefinedAntTasks/AntTask/Filename"
    AntTask.FilePath = XmlElement(XmlFpd, XmlTag)
    
    Dict[AntTask.Id] = AntTask
    return Dict

## Load Platform Build Options
#
# Read an input Platform XML DOM object and return a list of platform
# Build Option contained in the DOM object.
#
# @param   XmlBuildOptions              An XML DOM object read from FPD file
#
# @retvel  PlatformBuildOptions         A list of platform Build Options loaded from XmlFpd
#
def LoadBuildOptions(XmlBuildOptions):
    XmlTag = "Option"
    return map(LoadBuildOption, XmlList(XmlBuildOptions, XmlTag)) # LoadBuildOption is a method in MigrationUtilities.py

## Load Platform Build Option
#
# Read an input Platform XML DOM object and return a Build Option
# contained in the DOM object.
#
# @param   XmlFpd                      An XML DOM object read from FPD file
#
# @retvel  PlatformBuildOption         A Build Options loaded from XmlFpd
#
def LoadPlatformBuildOption(XmlBuildOptions):
    PlatformBuildOption = PlatformBuildOptionClass()
    
    # handle UserDefinedAntTasks
    XmlTag = "BuildOptions/UserDefinedAntTasks/AntTask"
    PlatformBuildOption.UserDefinedAntTasks = LoadUserDefinedAntTasks(XmlTag)
    
    # handle Options
    XmlTag = "BuildOptions/Options/Option"
    PlatformBuildOption.Options = map(LoadBuildOption, XmlList(XmlBuildOptions, XmlTag))
    
    # handle UserExtensions
    XmlTag = "BuildOptions/UserExtensions"
    PlatformBuildOption.UserExtensions = LoadUserExtensions(XmlTag) # from MigrationUtilities.py LoadUserExtensions

    # handle Ffs
    XmlTag = "BuildOptions/Ffs/FfsKey"
    PlatformBuildOption.FfsKeyList = map(LoadPlatformFfs, XmlList(XmlBuildOptions, XmlTag))

    return PlatformBuildOption

## Load Platform Ffs Dictionary
#
# Read an input Platform XML DOM object and return a platform Ffs Dictionary
# contained in the DOM object.
#
# @param  XmlFpd     An XML DOM object read from FPD file
#
# @retvel  Dict      A platform Ffs Dict loaded from XmlFpd
#
def LoadPlatformFfsDict(XmlFpd):
    Dict = {}
    XmlTag = "PlatformSurfaceArea/BuildOptions/Ffs"
    List = map(LoadPlatformFfs, XmlList(XmlFpd, XmlTag))
    if List != []:
        for Ffs in List:
            Dict[Ffs.Key] = Ffs
    return Dict

## Load Platform Ffs Section
#
# Read an input Platform XML DOM object and return a platform Ffs Section
# contained in the DOM object.
#
# @param   XmlFfs                  An XML DOM object read from FPD file
#
# @retvel  PlatformFfsSection      A platform Ffs Section loaded from XmlFpd
#
def LoadPlatformFfsSection(XmlFfsSection):
    PlatformFfsSection = PlatformFfsSectionClass()
    
    XmlTag = ""
    PlatformFfsSection.BindingOrder = ''
    
    XmlTag = ""
    PlatformFfsSection.Compressible = ''
    
    XmlTag = "SectionType"
    PlatformFfsSection.SectionType = XmlAttribute(XmlFfsSection, XmlTag)
    
    XmlTag = ""
    PlatformFfsSection.EncapsulationType = ''
    
    XmlTag = ""
    PlatformFfsSection.ToolName = ''
    
    XmlTag = ""
    PlatformFfsSection.Filenames = []
    
    XmlTag = ""
    PlatformFfsSection.Args = ''
    
    XmlTag = ""
    PlatformFfsSection.OutFile = ''
    
    XmlTag = ""
    PlatformFfsSection.OutputFileExtension = ''
    
    XmlTag = ""
    PlatformFfsSection.ToolNameElement = ''
    
    return PlatformFfsSection

## Load Platform Ffs Sections
#
# Read an input Platform XML DOM object and return a platform Ffs Sections
# contained in the DOM object.
#
# @param   XmlFfs                   An XML DOM object read from FPD file
#
# @retvel  PlatformFfsSections      A platform Ffs Sections loaded from XmlFpd
#
def LoadFfsSections():
    PlatformFfsSections = PlatformFfsSectionsClass()
    PlatformFfsSections.BindingOrder = ''
    PlatformFfsSections.Compressible = ''
    PlatformFfsSections.SectionType = ''
    PlatformFfsSections.EncapsulationType = ''
    PlatformFfsSections.ToolName = ''
    PlatformFfsSections.Section = []
    PlatformFfsSections.Sections = []
    
    return PlatformFfsSections

## Load Platform Ffs Sections
#
# Read an input Platform XML DOM object and return a platform Ffs Sections
# contained in the DOM object.
#
# @param   XmlFfs                   An XML DOM object read from FPD file
#
# @retvel  PlatformFfsSections      A platform Ffs Sections loaded from XmlFpd
#
def LoadPlatformFfsSections(XmlFfsSections):
    PlatformFfsSections = PlatformFfsSectionsClass()
    
    XmlTag = ""
    PlatformFfsSections.BindingOrder = ''
    
    XmlTag = ""
    Compressible = ''
    
    XmlTag = ""
    SectionType = ''
    
    XmlTag = "EncapsulationType"
    EncapsulationType = XmlAttribute(XmlFfsSections, XmlTag)
    
    XmlTag = ""
    ToolName = ''
    
    XmlTag = "Sections/Section"
    Section = []   #[ PlatformFfsSectionClass, ... ]
    Section = map(LoadPlatformFfsSection, XmlList(XmlFfsSections, XmlTag))
    
    
    XmlTag = "Sections/Sections"
    Sections = map(LoadFfsSections, XmlList(XmlFfsSections, XmlTag)) #[ PlatformFfsSectionsClass, ...]
    
    return PlatformFfsSections

## Load Platform Ffs Attribute
#
# Read an input Platform XML DOM object and return a platform Ffs Attribute
# contained in the DOM object.
#
# @param   XmlFfs    An XML DOM object read from FPD file
#
# @retvel  List      A platform Ffs Attribute loaded from XmlFpd
#
def LoadFfsAttribute(XmlFfs):
    List = []
    XmlTag = "Ffs/Attribute"
    for XmlAttr in XmlList(XmlFfs, XmlTag):
        XmlTag = "Name"
        Name = XmlAttribute(XmlAttr, XmlTag)
        XmlTag = "Value"
        Value = XmlAttribute(XmlAttr, XmlTag)
        List.append([Name,Value])
    return List

## Load a list of Platform Build Options
#
# Read an input Platform XML DOM object and return a list of Build Options
# contained in the DOM object.
#
# @param   XmlFfs              An XML DOM object read from FPD file
#
# @retvel  PlatformFfsKey      A platform Ffs key loaded from XmlFpd
#
def LoadPlatformFfs(XmlFfs):
    PlatformFfs = PlatformFfsClass()
    
    PlatformFfs.Attribute = {}
    Dict = {}

    List = LoadFfsAttribute(XmlFfs)
    
    XmlTag = "Ffs/Sections/Sections"
    PlatformFfs.Sections = map(LoadPlatformFfsSections, XmlList(XmlFfs, XmlTag)) #[PlatformFfsSectionsClass, ...]
    
    for Item in List:
        Name = Item[0]
        Value = Item[1]
        for Item in PlatformFfs.Sections:
            Dict[(Name, Item)] = Value
    PlatformFfs.Attribute = Dict
    
    XmlTag = "Ffs/FfsKey"
    PlatformFfs.Key = XmlAttribute(XmlFfs, XmlTag)
    
    return PlatformFfs

## Load a list of Platform Build Options
#
# Read an input Platform XML DOM object and return a list of Build Options
# contained in the DOM object.
#
# @param   XmlFpd                       An XML DOM object read from FPD file
#
# @retvel  PlatformBuildOptions         A list of Build Options loaded from XmlFpd
#
def LoadPlatformBuildOptions(XmlFpd):
    PlatformBuildOptions = PlatformBuildOptionClass()

    PlatformBuildOptions.UserDefinedAntTasks = LoadUserDefinedAntTasks(XmlFpd)
    
    XmlTag = "PlatformSurfaceArea/BuildOptions/Options/Option"
    PlatformBuildOptions.Options = map(LoadBuildOption, XmlList(XmlFpd, XmlTag))

    PlatformBuildOptions.UserExtensions = LoadPlatformUserExtension(XmlFpd)
    
    PlatformBuildOptions.FfsKeyList = LoadPlatformFfsDict(XmlFpd)
    
    return PlatformBuildOptions

## Load Platform Pcd Data
#
# Read an input Platform XML DOM object and return Platform module class object
# contained in the DOM object.
#
# @param    XmlPcd             An XML DOM object read from FPD file
#
# @retvel   PlatformPcdData    A Platform Pcd object loaded from XmlFpd
#
def LoadPlatformPcdData(XmlPcdData):
    PcdData = PcdClass() # defined in CommonDataClass.CommonClass.py

    XmlTag = "ItemType"
    PcdData.ItemType = XmlAttribute(XmlPcdData, XmlTag) #DYNAMIC

    XmlTag = "PcdData/C_Name"
    PcdData.C_NAME = XmlElement(XmlPcdData, XmlTag)
    
    XmlTag = "PcdData/Token"
    PcdData.Token = XmlElement(XmlPcdData, XmlTag)
    
    XmlTag = "PcdData/TokenSpaceGuidCName"
    PcdData.TokenSpaceGuidCName = XmlElement(XmlPcdData, XmlTag)
    
    XmlTag = "PcdData/DatumType"
    PcdData.DatumType = XmlElement(XmlPcdData, XmlTag)
    
    XmlTag = "PcdData/MaxDatumSize"
    PcdData.MaxDatumSize = XmlElement(XmlPcdData, XmlTag)
    
    XmlTag = "PcdData/Value"
    PcdData.Value = XmlElement(XmlPcdData, XmlTag)
    
    return PcdData

## Load a Platform Pcd Build Data
#
# Read an input Platform XML DOM object and return a list of Pcd Dynamic
# contained in the DOM object.
#
# @param    XmlPcdBuildData        An XML DOM object read from FPD file
#
# @retvel   PcdBuildData           A Platform Pcd Build Data loaded from XmlFpd
#
def LoadPlatformPcdBuildData(XmlPcdBuildData):
    PcdBuildData = PcdClass() # defined in CommonDataClass.CommonClass.py

    XmlTag = "ItemType"
    PcdBuildData.ItemType = XmlAttribute(XmlPcdBuildData, XmlTag) #DYNAMIC

    XmlTag = "PcdBuildData/C_Name"
    PcdBuildData.C_NAME = XmlElement(XmlPcdBuildData, XmlTag)

    XmlTag = "PcdBuildData/Token"
    PcdBuildData.Token = XmlElement(XmlPcdBuildData, XmlTag)

    XmlTag = "PcdBuildData/TokenSpaceGuidCName"
    PcdBuildData.TokenSpaceGuidCName = XmlElement(XmlPcdBuildData, XmlTag)

    XmlTag = "PcdBuildData/DatumType"
    PcdBuildData.DatumType = XmlElement(XmlPcdBuildData, XmlTag)

    XmlTag = "PcdBuildData/MaxDatumSize"
    PcdBuildData.MaxDatumSize = XmlElement(XmlPcdBuildData, XmlTag)
    
    #XmlTag = "PcdBuildData/Value"
    #PcdBuildData.Value = XmlElement(XmlPcdBuildData, XmlTag)

    return PcdBuildData

## Load a list of Platform Pcd Dynamic
#
# Read an input Platform XML DOM object and return a list of Pcd Dynamic
# contained in the DOM object.
#
# @param    XmlFpd             An XML DOM object read from FPD file
#
# @retvel   PcdDynamic         A list of Pcd Dynamic loaded from XmlFpd
#
def LoadDynamicPcdBuildDefinitions(XmlFpd):
    DynamicPcdBuildDefinitions = []
    XmlTag = "PlatformSurfaceArea/DynamicPcdBuildDefinitions/PcdBuildData"
    return map(LoadPlatformPcdBuildData, XmlList(XmlFpd, XmlTag))

## Load a Platform NameValue object
#
# Read an input Platform XML DOM object and return a list of User Extensions
# contained in the DOM object.
#
# @param  XmlNameValue       An XML DOM object read from FPD file
#
# @retvel NameValue          A Platform NameValue object
#
def LoadNameValue(XmlNameValue):
    NameValue = []
    
    XmlTag = "Name"
    Name = XmlAttribute(XmlNameValue, XmlTag)
    NameValue.append(Name)

    XmlTag = "Value"
    Value = XmlAttribute(XmlNameValue, XmlTag)
    NameValue.append(Value)
    
    return NameValue

## Load a Platform Fv Image Name object
#
# Read an input Platform XML DOM object and return a platform Fv Image
# Name contained in the DOM object.
#
# @param  XmlFvImageNames       An XML DOM object read from FPD file
#
# @retvel FvImageNames          A Platform Fv Image Name object
#
def LoadFvImageNames(XmlFvImageNames):
    XmlTag = "FvImageNames"
    FvImageNames = XmlElement(XmlFvImageNames, XmlTag)
    return FvImageNames

## Load a Platform Fv Image option object
#
# Read an input Platform XML DOM object and return a platform Fv Image
# Option contained in the DOM object.
#
# @param  XmlFvImageOptions         An XML DOM object read from FPD file
#
# @retvel PlatformFvImageOption     A Platform Fv Image Option object
#
def LoadFvImageOptions(XmlFvImageOptions):
    PlatformFvImageOption = PlatformFvImageOptionClass()
    
    XmlTag = ""
    PlatformFvImageOption.FvImageOptionName = ''
    
    XmlTag = ""
    PlatformFvImageOption.FvImageOptionValues = []

    XmlTag = "FvImageOptions/NameValue"
    List = map(LoadNameValue, XmlList(XmlFvImageOptions, XmlTag))
    
    return PlatformFvImageOption
    
## Load a Platform Fv Image object
#
# Read an input Platform XML DOM object and return a list of User Extensions
# contained in the DOM object.
#
# @param  XmlFvImage          An XML DOM object read from Fpd file
#
# @retvel PlatformFvImage     A Platform Fv Image object
#
def LoadPlatformFvImage(XmlFvImage):
    PlatformFvImage = PlatformFvImageClass()

    XmlTag = "Name"
    PlatformFvImage.Name = XmlAttribute(XmlFvImage, XmlTag)

    XmlTag = "Value"
    PlatformFvImage.Value = XmlAttribute(XmlFvImage, XmlTag)

    XmlTag = "Type"
    PlatformFvImage.Type = XmlAttribute(XmlFvImage, XmlTag)

    XmlTag = "FvImage/FvImageNames"
    PlatformFvImage.FvImageNames = map(LoadFvImageNames, XmlList(XmlFvImage, XmlTag))

    XmlTag = "FvImage/FvImageOptions"
    PlatformFvImage.FvImageOptions = map(LoadFvImageOptions, XmlList(XmlFvImage, XmlTag))
    
    return PlatformFvImage

## Load a Platform fdf object
#
# Read an input Platform XML DOM object and return a list of User Extensions
# contained in the DOM object.
#
# @param  XmlFvImages          An XML DOM object read from FPD file
#
# @retvel PlatformFdf          A Platform fdf object
#
def LoadPlatformFvImages(XmlFvImages):
    List = []
    
    XmlTag = "FvImages/NameValue"
    NameValues = map(LoadNameValue, XmlList(XmlFvImages, XmlTag))
    List.append(NameValues)
    
    XmlTag = "FvImages/FvImage"
    FvImages = map(LoadPlatformFvImage, XmlList(XmlFvImages, XmlTag))
    List.append(FvImages)
    
    XmlTag = "FvImages/FvImageName"
    FvImageNames = map(LoadPlatformFvImageName, XmlList(XmlFvImages, XmlTag))
    List.append(FvImageNames)
    
    return List

## Load a Platform Fv Image Name object
#
# Read an input Platform XML DOM object and return a list of User Extensions
# contained in the DOM object.
#
# @param  XmlFvImageName        An XML DOM object read from FPD file
#
# @retvel PlatformFvImageName   A Platform Fv Image Name object
#
def LoadPlatformFvImageName(XmlFvImageName):
    PlatformFvImageName = PlatformFvImageNameClass()

    XmlTag = "Name"
    PlatformFvImageName.Name = XmlAttribute(XmlFvImageName, XmlTag)
    
    XmlTag = "Type"
    PlatformFvImageName.Type = XmlAttribute(XmlFvImageName, XmlTag)
    
    XmlTag = "FvImageOptions"
    PlatformFvImageName.FvImageOptions = map(LoadFvImageOptions, XmlList(XmlFvImageName, XmlTag))
    
    return PlatformFvImageName
    
## Load a list of Platform fdf objects
#
# Read an input Platform XML DOM object and return a list of User Extensions
# contained in the DOM object.
#
# @param  XmlFpd                An XML DOM object read from FPD file
#
# @retvel PlatformFdfs          A list of Platform fdf object
#
def LoadPlatformFdfs(XmlFpd):
    PlatformFvImages = PlatformFvImagesClass()

    XmlTag = "PlatformSurfaceArea/Flash/FvImages"
    PlatformFvImages.FvImages = map(LoadPlatformFvImages, XmlList(XmlFpd, XmlTag))

    return PlatformFvImages

## Load a Platform User Extensions
#
# Read an input Platform XML DOM object and return an User Extension
# contained in the DOM object.
#
# @param  XmlUserExtension             An XML DOM object read from FPD file
#
# @retvel PlatformUserExtensions       A platform User Extension loaded from XmlFpd
#
def LoadPlatformUserExtension(XmlFpd):
    Dict = {}
    
    PlatformUserExtensions = UserExtensionsClass()

    XmlTag = "PlatformSurfaceArea/BuildOptions/UserExtensions"
    List = map(LoadUserExtensions, XmlList(XmlFpd, XmlTag))
    if List != []:
        for Item in List:
            UserID = Item.UserID
            Identifier = Item.Identifier
            Dict[(UserID, Identifier)] = Item
    #XmlTag = "PlatformSurfaceArea/BuildOptions/UserExtensions/UserID"
    #PlatformUserExtensions.UserID = XmlAttribute(XmlFpd, XmlTag)
    
    #XmlTag = "PlatformSurfaceArea/BuildOptions/UserExtensions/Identifier"
    #PlatformUserExtensions.Identifier = XmlAttribute(XmlFpd, XmlTag)
    
    #PlatformUserExtensions.Content = XmlElementData(XmlFpd)
    #Dict[(PlatformUserExtensions.UserID,PlatformUserExtensions.Identifier)] = PlatformUserExtensions
    #return PlatformUserExtensions
    return Dict

## Load a list of Platform User Extensions
#
# Read an input Platform XML DOM object and return a list of User Extensions
# contained in the DOM object.
#
# @param  XmlFpd               An XML DOM object read from FPD file
#
# @retvel UserExtensions       A list of platform User Extensions loaded from XmlFpd
#
def LoadPlatformUserExtensions(XmlFpd):
    XmlTag = "PlatformSurfaceArea/UserExtensions"
    return map(LoadUserExtensions, XmlList(XmlFpd, XmlTag)) # from MigrationUtilities.py LoadUserExtensions

## Load a new Platform class object
#
# Read an input FPD File and return a new Platform class Object.
#
# @param   FpdFileName              An XML DOM object read from FPD file
#
# @retvel  Platform                 A new Platform class object loaded from FPD File
#
def LoadFpd(FpdFileName):
    XmlFpd = XmlParseFile(FpdFileName)
    EdkLogger.verbose("Load FPD File: %s" % FpdFileName)
    
    Platform = PlatformClass()
    Platform.Header = LoadPlatformHeader(XmlFpd, FpdFileName)
    Platform.SkuInfos = LoadPlatformSkuInfos(XmlFpd)
    Platform.Libraries = [] #New in dsc spec, do not handle for now
    Platform.LibraryClasses = LoadPlatformLibraryClasses(XmlFpd)
    Platform.Modules = LoadPlatformModules(XmlFpd)
    Platform.FlashDefinitionFile = LoadPlatformFlashDefinitionFile(XmlFpd, FpdFileName)
    Platform.BuildOptions = LoadPlatformBuildOptions(XmlFpd)
    Platform.DynamicPcdBuildDefinitions = LoadDynamicPcdBuildDefinitions(XmlFpd)
    Platform.Fdf = LoadPlatformFdfs(XmlFpd)
    Platform.UserExtensions = LoadPlatformUserExtensions(XmlFpd)

    return Platform

# This acts like the main() function for the script, unless it is 'import'ed
# into another script.
if __name__ == '__main__':
    pass