## @file
# This file is used to define a class object to describe a module
#
# Copyright (c) 2007 - 2010, 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 *

## ModuleHeaderClass
#
# This class defined header items used in Module file
# 
# @param IdentificationClass:    Inherited from IdentificationClass class
# @param CommonHeaderClass:      Inherited from CommonHeaderClass class
# @param DefineClass:            Inherited from DefineClass class
#
# @var ModuleType:               To store value for ModuleType
# @var SupArchList:              To store value for SupArchList, selection scope is in below list
#                                EBC | IA32 | X64 | IPF | ARM | PPC | AARCH64
# @var BinaryModule:             To store value for BinaryModule
# @var OutputFileBasename:       To store value for OutputFileBasename
# @var ClonedFrom:               To store value for ClonedFrom, it is a set structure as
#                                [ ClonedRecordClass, ... ]
# @var PcdIsDriver:              To store value for PcdIsDriver, selection scope is in below list
#                                PEI_PCD_DRIVER | DXE_PCD_DRIVER
# @var TianoEdkFlashMap_h:       To store value for TianoEdkFlashMap_h
# @var InfVersion:               To store value for InfVersion
# @var UefiSpecificationVersion: To store value for UefiSpecificationVersion
# @var EdkReleaseVersion:        To store value for EdkReleaseVersion
# @var LibraryClass:             To store value for LibraryClass, it is a set structure as
#                                [ LibraryClassClass, ...]
# @var ComponentType:            To store value for ComponentType, selection scope is in below list
#                                LIBRARY | SECURITY_CORE | PEI_CORE | COMBINED_PEIM_DRIVER | PIC_PEIM | RELOCATABLE_PEIM | BS_DRIVER | RT_DRIVER | SAL_RT_DRIVER | APPLICATION
# @var MakefileName:             To store value for MakefileName
# @var BuildNumber:              To store value for BuildNumber
# @var BuildType:                To store value for BuildType
# @var FfsExt:                   To store value for FfsExt
# @var FvExt:                    To store value for FvExt
# @var SourceFv:                 To store value for SourceFv
# @var CustomMakefile:           To store value for CustomMakefile, it is a set structure as
#                                { Family : Filename, ... }
# @var Shadow:                   To store value for Shadow
# @var MacroDefines              To store the defined macros
#
class ModuleHeaderClass(IdentificationClass, CommonHeaderClass, DefineClass):
    def __init__(self):
        IdentificationClass.__init__(self)
        CommonHeaderClass.__init__(self)
        DefineClass.__init__(self)
        self.ModuleType = ''
        self.SupModuleList = []
        self.SupArchList = []
        self.BinaryModule = False
        self.OutputFileBasename = ''
        self.ClonedFrom = []
        self.PcdIsDriver = ''
        self.TianoEdkFlashMap_h = False
        self.InfVersion = ''
        self.PiSpecificationVersion = ''
        self.UefiSpecificationVersion = ''
        self.EdkReleaseVersion = ''
        self.LibraryClass = []
        self.ComponentType = ''
        self.MakefileName = ''
        self.BuildNumber = ''
        self.BuildType = ''
        self.FfsExt = ''
        self.FvExt = ''
        self.SourceFv = ''
        self.CustomMakefile = {}
        self.Shadow = ''
        self.MacroDefines = {}
        self.SourceOverridePath = ''
        self.Specification = []

## ModuleSourceFileClass
#
# This class defined source file item used in Module file
# 
# @param CommonClass:      Inherited from CommonClass class
# @param SourceFile:       Input value for SourceFile, default is ''
# @param TagName:          Input value for TagName, default is ''
# @param ToolCode:         Input value for ToolCode, default is ''
# @param ToolChainFamily:  Input value for ToolChainFamily, default is ''
# @param FeatureFlag:      Input value for FeatureFlag, default is ''
# @param SupArchList:      Input value for SupArchList, default is []
#
# @var SourceFile:         To store value for SourceFile
# @var TagName:            To store value for TagName
# @var ToolCode:           To store value for ToolCode
# @var ToolChainFamily:    To store value for ToolChainFamily
#
class ModuleSourceFileClass(CommonClass):
    def __init__(self, SourceFile = '', TagName = '', ToolCode = '', ToolChainFamily = '', FeatureFlag = '', SupArchList = None):
        self.SourceFile = SourceFile
        self.TagName = TagName
        self.ToolCode = ToolCode
        self.ToolChainFamily = ToolChainFamily
        self.FileType = ''
        CommonClass.__init__(self, FeatureFlag = FeatureFlag, SupArchList = SupArchList)

## ModuleBinaryFileClass
#
# This class defined binary file item used in Module file
# 
# @param CommonClass:    Inherited from CommonClass class
# @param BinaryFile:     Input value for BinaryFile, default is ''
# @param FileType:       Input value for FileType, default is ''
# @param FeatureFlag:    Input value for FeatureFlag, default is ''
# @param SupArchList:    Input value for SupArchList, default is []
#
# @var BinaryFile:       To store value for BinaryFile
# @var FileType:         To store value for FileType, selection scope is in below list
#                        FW | GUID | PREEFORM | UEFI_APP | UNI_UI | UNI_VER | LIB | PE32 | PIC | PEI_DEPEX | DXE_DEPEX | SMM_DEPEX| TE | VER | UI | BIN | FV
# @var Target:           To store value for Target
# @var ToolChainFamily:  To store value for ToolChainFamily
#
class ModuleBinaryFileClass(CommonClass):
    def __init__(self, BinaryFile = '', FileType = '', Target = '', FeatureFlag = '', SupArchList = None):
        self.BinaryFile = BinaryFile
        self.FileType = FileType
        self.Target = Target
        CommonClass.__init__(self, FeatureFlag = FeatureFlag, SupArchList = SupArchList)
        self.Filenames = []
        self.PatchPcdValues = []
        self.PcdExValues = []
        self.LibraryInstances = []
        self.BuildFlags = []

## ModulePackageDependencyClass
#
# This class defined package dependency item used in Module file
# 
# @param CommonClass:   Inherited from CommonClass class
# @param DefineClass:   Input value for DefineClass class
#
# @var FilePath:        To store value for FilePath
# @var PackageName:     To store value for PackageName
# @var PackageVersion:  To store value for PackageVersion
# @var PackageGuid:     To store value for PackageGuid
#
class ModulePackageDependencyClass(CommonClass, DefineClass):
    def __init__(self):
        self.FilePath = ''
        self.PackageName = ''
        self.PackageVersion = ''
        self.PackageGuid = ''
        self.Description = ''
        CommonClass.__init__(self)
        DefineClass.__init__(self)       

## ModuleLibraryClass
#
# This class defined library item used in Module file
# 
# @param CommonClass:  Inherited from CommonClass class
#
# @var Library:        To store value for Library
#
class ModuleLibraryClass(CommonClass):
    def __init__(self):
        self.Library = ''
        CommonClass.__init__(self)

## ModuleEventClass
#
# This class defined event item used in Module file
# 
# @param CommonClass:  Inherited from CommonClass class
#
# @var CName:          To store value for CName
# @var GuidCName:      To store value for GuidCName
# @var Type:           To store value for Type, selection scope is in below list
#                      CREATE_EVENT | SIGNAL_EVENT
#
class ModuleEventClass(CommonClass):        
    def __init__(self):
        self.CName = ''
        self.GuidCName = ''
        self.Type = ''                              
        CommonClass.__init__(self)

## ModuleHobClass
#
# This class defined hob item used in Module file
# 
# @param CommonClass:  Inherited from CommonClass class
#
# @var GuidCName:      To store value for GuidCName
# @var Type:           To store value for Type, selection scope is in below list
#                      PHIT | MEMORY_ALLOCATION | RESOURCE_DESCRIPTOR | GUID_EXTENSION | FIRMWARE_VOLUME | CPU | POOL | CAPSULE_VOLUME
#
class ModuleHobClass(CommonClass):
    def __init__(self):
        self.Type = ''
        self.GuidCName = ''
        CommonClass.__init__(self)

## ModuleVariableClass
#
# This class defined variable item used in Module file
# 
# @param CommonClass:  Inherited from CommonClass class
#
# @var GuidCName:      To store value for GuidCName
# @var Name:           To store value for Name
#
class ModuleVariableClass(CommonClass):
    def __init__(self):
        self.Name = ''
        self.GuidCName = ''
        CommonClass.__init__(self)

## ModuleBootModeClass
#
# This class defined boot mode item used in Module file
# 
# @param CommonClass:  Inherited from CommonClass class
#
# @var Name:           To store value for Name, selection scope is in below list
#                      FULL | MINIMAL | NO_CHANGE | DIAGNOSTICS | DEFAULT | S2_RESUME | S3_RESUME | S4_RESUME | S5_RESUME | FLASH_UPDATE | RECOVERY_FULL | RECOVERY_MINIMAL | RECOVERY_NO_CHANGE | RECOVERY_DIAGNOSTICS | RECOVERY_DEFAULT | RECOVERY_S2_RESUME | RECOVERY_S3_RESUME | RECOVERY_S4_RESUME | RECOVERY_S5_RESUME | RECOVERY_FLASH_UPDATE 
#
class ModuleBootModeClass(CommonClass):
    def __init__(self):
        self.Name = ''
        CommonClass.__init__(self)

## ModuleSystemTableClass
#
# This class defined system table item used in Module file
# 
# @param CommonClass:  Inherited from CommonClass class
#
# @var CName:          To store value for CName
#
class ModuleSystemTableClass(CommonClass):
    def __init__(self):
        self.CName = ''
        CommonClass.__init__(self)

## ModuleDataHubClass
#
# This class defined data hub item used in Module file
# 
# @param CommonClass:  Inherited from CommonClass class
#
# @var CName:          To store value for CName
#
class ModuleDataHubClass(CommonClass):
    def __init__(self):
        self.CName = ''
        CommonClass.__init__(self)        

## ModuleHiiPackageClass
#
# This class defined Hii package item used in Module file
# 
# @param CommonClass:  Inherited from CommonClass class
#
# @var CName:          To store value for CName
#
class ModuleHiiPackageClass(CommonClass):
    def __init__(self):
        self.CName = ''
        CommonClass.__init__(self)

## ModuleExternImageClass
#
# This class defined Extern Image item used in Module file
# 
# @param object:           Inherited from object class
#
# @var ModuleEntryPoint:   To store value for ModuleEntryPoint
# @var ModuleUnloadImage:  To store value for ModuleUnloadImage
#
class ModuleExternImageClass(object):
    def __init__(self):
        self.ModuleEntryPoint = ''
        self.ModuleUnloadImage = ''

## ModuleExternLibraryClass
#
# This class defined Extern Library item used in Module file
# 
# @param object:     Inherited from object class
#
# @var Constructor:  To store value for Constructor
# @var Destructor:   To store value for Destructor
#
class ModuleExternLibraryClass(object):
    def __init__(self):
        self.Constructor = ''
        self.Destructor = ''

## ModuleExternDriverClass
#
# This class defined Extern Driver item used in Module file
# 
# @param object:       Inherited from object class
#
# @var DriverBinding:  To store value for DriverBinding
# @var ComponentName:  To store value for ComponentName
# @var DriverConfig:   To store value for DriverConfig
# @var DriverDiag:     To store value for DriverDiag
#
class ModuleExternDriverClass(object):
    def __init__(self):
        self.DriverBinding= ''
        self.ComponentName = ''
        self.DriverConfig = ''
        self.DriverDiag = ''

## ModuleExternCallBackClass
#
# This class defined Extern Call Back item used in Module file
# 
# @param object:                      Inherited from object class
#
# @var SetVirtualAddressMapCallBack:  To store value for SetVirtualAddressMapCallBack
# @var ExitBootServicesCallBack:      To store value for ExitBootServicesCallBack
#
class ModuleExternCallBackClass(object):
    def __init__(self):
        self.SetVirtualAddressMapCallBack = ''
        self.ExitBootServicesCallBack = ''

## ModuleExternClass
#
# This class defined Extern used in Module file
# 
# @param object:                      Inherited from object class
#
#
class ModuleExternClass(CommonClass):
    def __init__(self):
        self.EntryPoint = ''
        self.UnloadImage = ''
        self.Constructor = ''
        self.Destructor = ''
        CommonClass.__init__(self)

## ModuleDepexClass
#
# This class defined depex item used in Module file
# 
# @param CommonClass:  Inherited from CommonClass class
# @param DefineClass:  Input value for DefineClass class
#
# @var Depex:          To store value for Depex
#
class ModuleDepexClass(CommonClass, DefineClass):
    def __init__(self):
        CommonClass.__init__(self)
        DefineClass.__init__(self)
        self.Depex = ''

## ModuleNmakeClass
#
# This class defined nmake item used in Module file
# 
# @param CommonClass:  Inherited from CommonClass class
#
# @var Name:           To store value for Name
# @var Value:          To store value for Value
#
class ModuleNmakeClass(CommonClass):
    def __init__(self):
        CommonClass.__init__(self)
        self.Name = ''
        self.Value = ''

## ModuleClass
#
# This class defined a complete module item
# 
# @param object:    Inherited from object class
#
# @var Header:               To store value for Header, it is a structure as
#                            {Arch : ModuleHeaderClass}
# @var LibraryClasses:       To store value for LibraryClasses, it is a list structure as
#                            [ LibraryClassClass, ...]
# @var Libraries:            To store value for Libraries, it is a list structure as
#                            [ ModuleLibraryClass, ...]
# @var Sources:              To store value for Sources, it is a list structure as
#                            [ ModuleSourceFileClass, ...]
# @var Binaries:             To store value for Binaries, it is a list structure as
#                            [ ModuleBinaryFileClass, ...]
# @var NonProcessedFiles:    To store value for NonProcessedFiles, it is a list structure as
#                            [ '', '', ...]
# @var PackageDependencies:  To store value for PackageDependencies, it is a list structure as
#                            [ ModulePackageDependencyClass, ... ] 
# @var Nmake:                To store value for Nmake, it is a list structure as
#                            [ ModuleNmakeClass, ... ]
# @var Depex:                To store value for Depex, it is a list structure as
#                            [ ModuleDepexClass, ... ]
# @var Includes:             To store value for Includes, it is a list structure as
#                            [ IncludeClass, ...]
# @var Protocols:            To store value for Protocols, it is a list structure as
#                            [ ProtocolClass, ...]
# @var Ppis:                 To store value for Ppis, it is a list structure as
#                            [ PpiClass, ...]
# @var Events:               To store value for Events, it is a list structure as
#                            [ ModuleEventClass, ...]
# @var Hobs:                 To store value for Hobs, it is a list structure as
#                            [ ModuleHobClass, ...] 
# @var Variables:            To store value for Variables, it is a list structure as
#                            [ ModuleVariableClass, ...]
# @var BootModes:            To store value for BootModes, it is a list structure as
#                            [ ModuleBootModeClass, ...]
# @var SystemTables:         To store value for SystemTables, it is a list structure as
#                            [ ModuleSystemTableClass, ...]
# @var DataHubs:             To store value for DataHubs, it is a list structure as
#                            [ ModuleDataHubClass, ...]
# @var HiiPackages:          To store value for HiiPackages, it is a list structure as
#                            [ ModuleHiiPackageClass, ...]
# @var Guids:                To store value for Guids, it is a list structure as
#                            [ GuidClass, ...]
# @var PcdCodes:             To store value for PcdCodes, it is a list structure as
#                            [ PcdClass, ...]
# @var ExternImages:         To store value for ExternImages, it is a list structure as
#                            [ ModuleExternImageClass, ...]
# @var ExternLibraries:      To store value for ExternLibraries, it is a list structure as
#                            [ ModuleExternLibraryClass, ...]
# @var ExternDrivers:        To store value for ExternDrivers, it is a list structure as
#                            [ ModuleExternDriverClass, ...]
# @var ExternCallBacks:      To store value for ExternCallBacks, it is a list structure as
#                            [ ModuleExternCallBackClass, ...]
# @var BuildOptions:         To store value for BuildOptions, it is a list structure as
#                            [ BuildOptionClass, ...]
# @var UserExtensions:       To store value for UserExtensions, it is a list structure as
#                            [ UserExtensionsClass, ...]
#
class ModuleClass(object):
    def __init__(self):
        self.Header = {}
        self.ModuleHeader = ModuleHeaderClass()
        self.LibraryClasses = []
        self.Libraries = []
        self.Sources = []
        self.Binaries = []
        self.NonProcessedFiles = []
        self.PackageDependencies = []
        self.Nmake = []
        self.Depex = []
        self.PeiDepex = None
        self.DxeDepex = None
        self.SmmDepex = None
        self.Includes = []
        self.Protocols = []
        self.Ppis = []
        self.Events = []
        self.Hobs = []
        self.Variables = []
        self.BootModes = []
        self.SystemTables = []
        self.DataHubs = []
        self.HiiPackages = []
        self.Guids = []
        self.PcdCodes = []
        self.ExternImages = []
        self.ExternLibraries = []
        self.ExternDrivers = []
        self.ExternCallBacks = []
        self.Externs = []
        self.BuildOptions = []
        self.UserExtensions = None
        self.MiscFiles = None
        self.FileList = []

##
#
# This acts like the main() function for the script, unless it is 'import'ed into another
# script.
#
if __name__ == '__main__':
    M = ModuleClass()
