## @file
# This file is used to define a class object to describe a platform
#
# 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
#
from CommonClass import *

## SkuInfoListClass
#
# This class defined sku info list item used in platform file
# 
# @param IncludeStatementClass:  Inherited from IncludeStatementClass class
#
# @var SkuInfoList:              To store value for SkuInfoList, it is a set structure as
#                                { SkuName : SkuId }
#
class SkuInfoListClass(IncludeStatementClass):
    def __init__(self):
        IncludeStatementClass.__init__(self)
        self.SkuInfoList = {}

## PlatformHeaderClass
#
# This class defined header items used in Platform file
# 
# @param IdentificationClass:    Inherited from IdentificationClass class
# @param CommonHeaderClass:      Inherited from CommonHeaderClass class
# @param DefineClass:            Inherited from DefineClass class
#
# @var DscSpecification:         To store value for DscSpecification
# @var SupArchList:              To store value for SupArchList, selection scope is in below list
#                                EBC | IA32 | X64 | IPF | ARM | PPC
# @var BuildTargets:             To store value for BuildTargets, selection scope is in below list
#                                RELEASE | DEBUG
# @var IntermediateDirectories:  To store value for IntermediateDirectories, selection scope is in below list
#                                MODULE | UNIFIED
# @var OutputDirectory:          To store value for OutputDirectory
# @var ForceDebugTarget:         To store value for ForceDebugTarget
# @var SkuIdName:                To store value for SkuIdName
# @var BuildNumber:              To store value for BuildNumber
# @var MakefileName:             To store value for MakefileName
# @var ClonedFrom:               To store value for ClonedFrom, it is a list structure as
#                                [ ClonedRecordClass, ... ]
#
class PlatformHeaderClass(IdentificationClass, CommonHeaderClass, DefineClass):
    def __init__(self):
        IdentificationClass.__init__(self)
        CommonHeaderClass.__init__(self)
        DefineClass.__init__(self)
        self.DscSpecification = ''
        self.SupArchList = []
        self.BuildTargets = []
        self.IntermediateDirectories = ''
        self.OutputDirectory = ''                                                    
        self.ForceDebugTarget = ''
        self.SkuIdName = []
        self.BuildNumber = ''
        self.MakefileName = ''
        self.ClonedFrom = []

## PlatformFlashDefinitionFileClass
#
# This class defined FlashDefinitionFile item used in platform file
# 
# @param object:   Inherited from object class
#
# @var Id:         To store value for Id
# @var UiName:     To store value for UiName
# @var Preferred:  To store value for Preferred
# @var FilePath:   To store value for FilePath
#
class PlatformFlashDefinitionFileClass(object):
    def __init__(self):
        self.Id = ''
        self.UiName = ''
        self.Preferred = False
        self.FilePath = ''

## PlatformFvImageOptionClass
#
# This class defined FvImageOption item used in platform file
# 
# @param object:             Inherited from object class
#
# @var FvImageOptionName:    To store value for FvImageOptionName
# @var FvImageOptionValues:  To store value for FvImageOptionValues
#
class PlatformFvImageOptionClass(object):
    def __init__(self):
        self.FvImageOptionName = ''
        self.FvImageOptionValues = []

## PlatformFvImageClass
#
# This class defined FvImage item used in platform file
# 
# @param object:        Inherited from object class
#
# @var Name:            To store value for Name
# @var Value:           To store value for Value
# @var Type:            To store value for Type, selection scope is in below list
#                       Attributes | Options | Components | ImageName 
# @var FvImageNames:    To store value for FvImageNames
# @var FvImageOptions:  To store value for FvImageOptions, it is a list structure as
#                       [ PlatformFvImageOption, ...]
#
class PlatformFvImageClass(object):
    def __init__(self):
        self.Name = ''
        self.Value = ''
        self.Type = ''
        self.FvImageNames = []
        self.FvImageOptions = []

## PlatformFvImageNameClass
#
# This class defined FvImageName item used in platform file
# 
# @param object:        Inherited from object class
#
# @var Name:            To store value for Name
# @var Type:            To store value for Type, selection scope is in below list
#                       FV_MAIN | FV_MAIN_COMPACT | NV_STORAGE | FV_RECOVERY | FV_RECOVERY_FLOPPY | FV_FILE | CAPSULE_CARGO | NULL | USER_DEFINED 
# @var FvImageOptions:  To store value for FvImageOptions, it is a list structure as
#                       [ PlatformFvImageOption, ...]
#
class PlatformFvImageNameClass(object):
    def __init__(self):
        self.Name = ''
        self.Type = ''
        self.FvImageOptions = []

## PlatformFvImagesClass
#
# This class defined FvImages item used in platform file
# 
# @param object:  Inherited from object class
#
# @var FvImages:  To store value for FvImages
#
class PlatformFvImagesClass(object):
    def __init__(self):
        self.FvImages = []

## PlatformAntTaskClass
#
# This class defined AntTask item used in platform file
# 
# @param object:       Inherited from object class
#
# @var Id:             To store value for Id
# @var AntCmdOptions:  To store value for AntCmdOptions
# @var FilePath:       To store value for FilePath
#
class PlatformAntTaskClass(object):
    def __init__(self):
        self.Id = ''
        self.AntCmdOptions = ''
        self.FilePath = ''

## PlatformFfsSectionClass
#
# This class defined FfsSection item used in platform file
# 
# @param CommonClass:        Inherited from CommonClass class
#
# @var BindingOrder:         To store value for BindingOrder
# @var Compressible:         To store value for Compressible
# @var SectionType:          To store value for SectionType
# @var EncapsulationType:    To store value for EncapsulationType
# @var ToolName:             To store value for ToolName
# @var Filenames:            To store value for Filenames
# @var Args:                 To store value for Args
# @var OutFile:              To store value for OutFile
# @var OutputFileExtension:  To store value for OutputFileExtension
# @var ToolNameElement:      To store value for ToolNameElement
#
class PlatformFfsSectionClass(CommonClass):
    def __init__(self):
        CommonClass.__init__(self)
        self.BindingOrder = ''
        self.Compressible = ''
        self.SectionType  = ''
        self.EncapsulationType  = ''
        self.ToolName = ''
        self.Filenames = []
        self.Args = ''
        self.OutFile = ''
        self.OutputFileExtension = ''
        self.ToolNameElement = ''

## PlatformFfsSectionsClass
#
# This class defined FfsSections item used in platform file
# 
# @param CommonClass:      Inherited from CommonClass class
#
# @var BindingOrder:       To store value for BindingOrder
# @var Compressible:       To store value for Compressible
# @var SectionType:        To store value for SectionType
# @var EncapsulationType:  To store value for EncapsulationType
# @var ToolName:           To store value for ToolName
# @var Section:            To store value for Section, it is a list structure as
#                          [ PlatformFfsSectionClass, ... ]
# @var Sections:           To store value for Sections, it is a list structure as
#                          [ PlatformFfsSectionsClass, ...]
#
class PlatformFfsSectionsClass(CommonClass):
    def __init__(self):
        CommonClass.__init__(self)
        self.BindingOrder = ''
        self.Compressible = ''
        self.SectionType = ''
        self.EncapsulationType = ''
        self.ToolName = ''
        self.Section = []
        self.Sections = []

## PlatformFfsClass
#
# This class defined Ffs item used in platform file
# 
# @param object:   Inherited from object class
#
# @var Attribute:  To store value for Attribute, it is a set structure as
#                  { [(Name, PlatformFfsSectionsClass)] : Value}
# @var Sections:   To store value for Sections, it is a list structure as
#                  [ PlatformFfsSectionsClass]
# @var ToolName:   To store value for ToolName
#
class PlatformFfsClass(object):
    def __init__(self):
        self.Attribute = {}
        self.Sections = []
        self.Key = ''

## PlatformBuildOptionClass
#
# This class defined BuildOption item used in platform file
# 
# @param object:             Inherited from object class
#
# @var UserDefinedAntTasks:  To store value for UserDefinedAntTasks, it is a set structure as
#                            { [Id] : PlatformAntTaskClass, ...}
# @var Options:              To store value for Options, it is a list structure as
#                            [ BuildOptionClass, ...]
# @var UserExtensions:       To store value for UserExtensions, it is a set structure as
#                            { [(UserID, Identifier)] : UserExtensionsClass, ...}
# @var FfsKeyList:           To store value for FfsKeyList, it is a set structure as
#                            { [FfsKey]: PlatformFfsClass, ...} 
#
class PlatformBuildOptionClass(object):
    def __init__(self):
        self.UserDefinedAntTasks = {}
        self.Options = []
        self.UserExtensions = {}
        self.FfsKeyList = {}

## PlatformBuildOptionClasses
#
# This class defined BuildOption item list used in platform file
# 
# @param IncludeStatementClass:  Inherited from IncludeStatementClass class
#
# @var FvBinding:                To store value for FvBinding
# @var FfsFileNameGuid:          To store value for FfsFileNameGuid
# @var FfsFormatKey:             To store value for FfsFormatKey
# @var BuildOptionList:          To store value for BuildOptionList, it is a list structure as
#                                [ BuildOptionClass, ... ]
#
class PlatformBuildOptionClasses(IncludeStatementClass):
    def __init__(self):
        IncludeStatementClass.__init__(self)
        self.FvBinding = ''
        self.FfsFileNameGuid = ''
        self.FfsFormatKey = ''
        self.BuildOptionList = []

## PlatformLibraryClass
#
# This class defined Library item used in platform file
# 
# @param CommonClass:   Inherited from CommonClass class
# @param DefineClass:   Inherited from DefineClass class
# @param Name:          Input value for Name, default is ''
# @param FilePath:      Input value for FilePath, default is ''
#
# @var Name:            To store value for Name
# @var FilePath:        To store value for FilePath
# @var ModuleType:      To store value for ModuleType
# @var SupModuleList:   To store value for SupModuleList
# @var ModuleGuid:      To store value for ModuleGuid
# @var ModuleVersion:   To store value for ModuleVersion
# @var PackageGuid:     To store value for PackageGuid
# @var PackageVersion:  To store value for PackageVersion
#
class PlatformLibraryClass(CommonClass, DefineClass):
    def __init__(self, Name = '', FilePath = ''):
        CommonClass.__init__(self)
        DefineClass.__init__(self)
        self.Name = Name
        self.FilePath = FilePath
        self.ModuleType = []
        self.SupModuleList = []
        self.ModuleGuid = ''
        self.ModuleVersion = ''
        self.PackageGuid = ''
        self.PackageVersion = ''

## PlatformLibraryClasses
#
# This class defined Library item list used in platform file
# 
# @param IncludeStatementClass:  Inherited from IncludeStatementClass class
#
# @var LibraryList:              To store value for LibraryList, it is a list structure as
#                                [ PlatformLibraryClass, ... ]
#
class PlatformLibraryClasses(IncludeStatementClass):
    def __init__(self):
        IncludeStatementClass.__init__(self)
        self.LibraryList = []

## PlatformModuleClass
#
# This class defined Module item used in platform file
# 
# @param CommonClass:            Inherited from CommonClass class
# @param DefineClass:            Inherited from DefineClass class
# @param IncludeStatementClass:  Inherited from IncludeStatementClass class
#
# @var Name:                     To store value for Name (Library name or libraryclass name or module name)
# @var FilePath:                 To store value for FilePath
# @var Type:                     To store value for Type, selection scope is in below list
#                                LIBRARY | LIBRARY_CLASS | MODULE
# @var ModuleType:               To store value for ModuleType
# @var ExecFilePath:             To store value for ExecFilePath
# @var LibraryClasses:           To store value for LibraryClasses, it is a structure as
#                                PlatformLibraryClasses
# @var PcdBuildDefinitions:      To store value for PcdBuildDefinitions, it is a list structure as
#                                [ PcdClass, ...]
# @var ModuleSaBuildOption:      To store value for ModuleSaBuildOption, it is a structure as
#                                PlatformBuildOptionClasses
# @var Specifications:           To store value for Specifications, it is a list structure as
#                                [ '', '', ...]
#
class PlatformModuleClass(CommonClass, DefineClass, IncludeStatementClass):
    def __init__(self):
        CommonClass.__init__(self)
        DefineClass.__init__(self)
        self.Name = ''
        self.FilePath = ''
        self.Type = ''
        self.ModuleType = ''
        self.ExecFilePath = ''
        self.LibraryClasses = PlatformLibraryClasses()
        self.PcdBuildDefinitions = []
        self.ModuleSaBuildOption = PlatformBuildOptionClasses()
        self.Specifications = []
        self.SourceOverridePath = ''

## PlatformModuleClasses
#
# This class defined Module item list used in platform file
# 
# @param IncludeStatementClass:  Inherited from IncludeStatementClass class
#
# @var ModuleList:               To store value for ModuleList, it is a list structure as
#                                [ PlatformModuleClass, ... ]
#
class PlatformModuleClasses(IncludeStatementClass):
    def __init__(self):
        IncludeStatementClass.__init__(self)
        self.ModuleList = []

## PlatformClass
#
# This class defined a complete platform item
# 
# @param object:                    Inherited from object class
#
# @var Header:                      To store value for Header, it is a structure as
#                                   {Arch : PlatformHeaderClass()}
# @var SkuInfos:                    To store value for SkuInfos, it is a structure as
#                                   SkuInfoListClass
# @var Libraries:                   To store value for Libraries, it is a structure as
#                                   PlatformLibraryClasses
# @var LibraryClasses:              To store value for LibraryClasses, it is a structure as
#                                   PlatformLibraryClasses
# @var Modules:                     To store value for Modules, it is a structure as
#                                   PlatformModuleClasses
# @var FlashDefinitionFile:         To store value for FlashDefinitionFile, it is a structure as
#                                   PlatformFlashDefinitionFileClass
# @var BuildOptions:                To store value for BuildOptions, it is a structure as
#                                   PlatformBuildOptionClasses
# @var DynamicPcdBuildDefinitions:  To store value for DynamicPcdBuildDefinitions, it is a list structure as
#                                   [ PcdClass, ...]
# @var Fdf:                         To store value for Fdf, it is a list structure as
#                                   [ FdfClass, ...]
# @var UserExtensions:              To store value for UserExtensions, it is a list structure as
#                                   [ UserExtensionsClass, ...]
#
class PlatformClass(object):
    def __init__(self):
        self.Header = {}
        self.SkuInfos = SkuInfoListClass()
        self.Libraries = PlatformLibraryClasses()
        self.LibraryClasses = PlatformLibraryClasses()
        self.Modules = PlatformModuleClasses()
        self.FlashDefinitionFile = PlatformFlashDefinitionFileClass()
        self.BuildOptions = PlatformBuildOptionClasses()
        self.DynamicPcdBuildDefinitions = []
        self.Fdf = []
        self.UserExtensions = []

##
#
# This acts like the main() function for the script, unless it is 'import'ed into another
# script.
#
if __name__ == '__main__':
    P = PlatformClass()
