## @file
# This file is used to define common items of class object
#
# Copyright (c) 2007 - 2015, 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.


#
# Generate help text
#
def GenerateHelpText(Text, Lang):
    if Text:
        Ht = HelpTextClass()
        Ht.Lang = Lang
        Ht.String = Text
    
        return Ht
    
    return None

## CommonClass
#
# This class defined common items used in Module/Platform/Package files
# 
# @param object:       Inherited from object class
# @param Usage:        Input value for Usage, default is [] 
# @param FeatureFlag:  Input value for FeatureFalg, default is ''
# @param SupArchList:  Input value for SupArchList, default is []
# @param HelpText:     Input value for HelpText, default is ''
#
# @var Usage:          To store value for Usage, selection scope is in below list
#                      ALWAYS_CONSUMED | SOMETIMES_CONSUMED | ALWAYS_PRODUCED | SOMETIMES_PRODUCED | TO_START | BY_START | PRIVATE
# @var FeatureFlag:    To store value for FeatureFlag
# @var SupArchList:    To store value for SupArchList, selection scope is in below list
#                      EBC | IA32 | X64 | IPF | ARM | PPC | AARCH64
# @var HelpText:       To store value for HelpText
#
class CommonClass(object):
    def __init__(self, Usage = None, FeatureFlag = '', SupArchList = None, HelpText = ''):
        self.Usage = Usage
        if self.Usage == None:
            self.Usage = []
        self.FeatureFlag = FeatureFlag
        self.SupArchList = SupArchList
        if self.SupArchList == None:
            self.SupArchList = []
        self.HelpText = HelpText
        self.HelpTextList = []

## CommonHeaderClass
#
# This class defined common items used in Module/Platform/Package files
# 
# @param object:          Inherited from object class
#
# @var Abstract:          To store value for Abstract
# @var Description:       To store value for Description
# @var Copyright:         To store value for Copyright
# @var License:           To store value for License
# @var Specification:     To store value for Specification
#
class CommonHeaderClass(object):
    def __init__(self):
        self.Abstract = ''
        self.Description = ''
        self.Copyright = ''
        self.License = ''
        self.Specification = {}

## HelpTextClass
#
# This class defined HelpText item used in PKG file
# 
# @param object:     Inherited from object class
#
# @var Lang:         To store value for Lang
# @var String:       To store value for String
#
class HelpTextClass(object):
    def __init__(self):
        self.Lang = ''
        self.String = ''
    
## DefineClass
#
# This class defined item DEFINE used in Module/Platform/Package files
#
# @param object:  Inherited from object class
#
# @var Define:    To store value for Define, it is a set structure as
#                 { (DefineName, Arch) : DefineValue, ... }
#
class DefineClass(object):
    def __init__(self):
        self.Define = {}

## ClonedRecordClass
#
# This class defined ClonedRecord items used in Module/Platform/Package files
# 
# @param object:        Inherited from object class
#
# @var Id:              To store value for Id
# @var FarGuid:         To store value for FarGuid
# @var PackageGuid:     To store value for PackageGuid
# @var PackageVersion:  To store value for PackageVersion
# @var ModuleGuid:      To store value for ModuleGuid
# @var ModuleVersion:   To store value for ModuleVersion
#
class ClonedRecordClass(object):
    def __init__(self):
        self.Id = 0
        self.FarGuid = ''
        self.PackageGuid = ''
        self.PackageVersion = ''
        self.ModuleGuid = ''
        self.ModuleVersion = ''

## IdentificationClass
#
# This class defined Identification items used in Module/Platform/Package files
# 
# @param object:  Inherited from object class
#
# @var Name:      To store value for Name
#                 ModuleName(Inf) / PackageName(Dec) / PlatformName(Dsc)
# @var Guid:      To store value for Guid
# @var Version:   To store value for Version
# @var FileName:  To store value for FileName
# @var FullPath:  To store value for FullPath
#
class IdentificationClass(object):
    def __init__(self):
        self.Name = ''
        self.BaseName = ''
        self.Guid = ''
        self.Version = ''
        self.FileName = ''
        self.FullPath = ''
        self.RelaPath = ''
        self.PackagePath = ''
        self.ModulePath = ''
        self.CombinePath = ''

## IncludeStatementClass
#
# This class defined IncludeFiles item used in Module/Platform/Package files
# 
# @param object:      Inherited from object class
#
# @var IncludeFiles:  To store value for IncludeFiles
#                     It is a set structure as { IncludeFile : [Arch1, Arch2, ...], ... }
#
class IncludeStatementClass(object):
    def __init__(self):
        self.IncludeFiles = {}                             

## GuidProtocolPpiCommonClass
#
# This class defined Guid, Protocol and Ppi like items used in Module/Platform/Package files
# 
# @param CommonClass:  Inherited from CommonClass class
#
# @var Name:           To store value for Name
# @var CName:          To store value for CName
# @var Guid:           To store value for Guid
# @var Notify:         To store value for Notify
# @var GuidTypeList:   To store value for GuidTypeList, selection scope is in below list
#                      DATA_HUB_RECORD | EFI_EVENT | EFI_SYSTEM_CONFIGURATION_TABLE | EFI_VARIABLE | GUID | HII_PACKAGE_LIST | HOB | TOKEN_SPACE_GUID
# @var SupModuleList:  To store value for SupModuleList, selection scope is in below list
#                      BASE | SEC | PEI_CORE | PEIM | DXE_CORE | DXE_DRIVER | DXE_RUNTIME_DRIVER | DXE_SAL_DRIVER | DXE_SMM_DRIVER | UEFI_DRIVER | UEFI_APPLICATION | USER_DEFINED | SMM_CORE
#
class GuidProtocolPpiCommonClass(CommonClass):
    def __init__(self):
        self.Name = ''
        self.CName = ''
        self.Guid = ''
        self.VariableName = ''
        self.Notify = False
        self.GuidTypeList = []
        self.GuidTypeLists = []
        self.SupModuleList = []                           
        CommonClass.__init__(self)

## LibraryClassClass
#
# This class defined Library item used in Module/Platform/Package files
# 
# @param CommonClass:               Inherited from CommonClass class
# @param DefineClass:               Inherited from DefineClass class
#
# @var LibraryClass:                To store value for LibraryClass
# @var IncludeHeader:               To store value for IncludeHeader
# @var RecommendedInstanceVersion:  To store value for RecommendedInstanceVersion
# @var RecommendedInstanceGuid:     To store value for RecommendedInstanceGuid
# @var RecommendedInstance:         To store value for RecommendedInstance, selection scope is in below list
#                                   DATA_HUB_RECORD | EFI_EVENT | EFI_SYSTEM_CONFIGURATION_TABLE | EFI_VARIABLE | GUID | HII_PACKAGE_LIST | HOB | TOKEN_SPACE_GUID
# @var SupModuleList:               To store value for SupModuleList, selection scope is in below list
#                                   BASE | SEC | PEI_CORE | PEIM | DXE_CORE | DXE_DRIVER | DXE_RUNTIME_DRIVER | DXE_SAL_DRIVER | DXE_SMM_DRIVER | UEFI_DRIVER | UEFI_APPLICATION | USER_DEFINED | SMM_CORE
#
class LibraryClassClass(CommonClass, DefineClass):
    def __init__(self):
        self.LibraryClass = ''
        self.IncludeHeader = ''
        self.RecommendedInstanceVersion = ''
        self.RecommendedInstanceGuid = ''
        self.RecommendedInstance = ''
        self.SupModuleList = []
        CommonClass.__init__(self)
        DefineClass.__init__(self)

## GuidClass
#
# This class defined Guid item used in Module/Platform/Package files
# 
# @param GuidProtocolPpiCommonClass:  Inherited from GuidProtocolPpiCommonClass class
#
class GuidClass(GuidProtocolPpiCommonClass):
    def __init__(self):
        GuidProtocolPpiCommonClass.__init__(self)

## ProtocolClass
#
# This class defined Protocol item used in Module/Platform/Package files
# 
# @param GuidProtocolPpiCommonClass:  Inherited from GuidProtocolPpiCommonClass class
#
class ProtocolClass(GuidProtocolPpiCommonClass):
    def __init__(self):
        GuidProtocolPpiCommonClass.__init__(self)

## PpiClass
#
# This class defined Ppi item used in Module/Platform/Package files
# 
# @param GuidProtocolPpiCommonClass:  Inherited from GuidProtocolPpiCommonClass class
#
class PpiClass(GuidProtocolPpiCommonClass):        
    def __init__(self):
        GuidProtocolPpiCommonClass.__init__(self)

## SkuInfoClass
#
# This class defined SkuInfo item used in Module/Platform/Package files
# 
# @param object:           Inherited from object class
# @param SkuIdName:        Input value for SkuIdName, default is ''
# @param SkuId:            Input value for SkuId, default is ''
# @param VariableName:     Input value for VariableName, default is ''
# @param VariableGuid:     Input value for VariableGuid, default is ''
# @param VariableOffset:   Input value for VariableOffset, default is ''
# @param HiiDefaultValue:  Input value for HiiDefaultValue, default is ''
# @param VpdOffset:        Input value for VpdOffset, default is ''
# @param DefaultValue:     Input value for DefaultValue, default is ''
#
# @var SkuIdName:          To store value for SkuIdName
# @var SkuId:              To store value for SkuId
# @var VariableName:       To store value for VariableName
# @var VariableGuid:       To store value for VariableGuid
# @var VariableOffset:     To store value for VariableOffset
# @var HiiDefaultValue:    To store value for HiiDefaultValue
# @var VpdOffset:          To store value for VpdOffset
# @var DefaultValue:       To store value for DefaultValue
#
class SkuInfoClass(object):
    def __init__(self, SkuIdName = '', SkuId = '', VariableName = '', VariableGuid = '', VariableOffset = '', 
                 HiiDefaultValue = '', VpdOffset = '', DefaultValue = '', VariableGuidValue = '', VariableAttribute = ''):
        self.SkuIdName = SkuIdName
        self.SkuId = SkuId
        
        #
        # Used by Hii
        #
        self.VariableName = VariableName
        self.VariableGuid = VariableGuid
        self.VariableGuidValue = VariableGuidValue
        self.VariableOffset = VariableOffset
        self.HiiDefaultValue = HiiDefaultValue
        self.VariableAttribute = VariableAttribute
        
        #
        # Used by Vpd
        #
        self.VpdOffset = VpdOffset
        
        #
        # Used by Default
        #
        self.DefaultValue = DefaultValue
        
    ## Convert the class to a string
    #
    #  Convert each member of the class to string
    #  Organize to a signle line format string
    #
    #  @retval Rtn Formatted String
    #
    def __str__(self):
        Rtn = 'SkuId = ' + str(self.SkuId) + "," + \
                    'SkuIdName = ' + str(self.SkuIdName) + "," + \
                    'VariableName = ' + str(self.VariableName) + "," + \
                    'VariableGuid = ' + str(self.VariableGuid) + "," + \
                    'VariableOffset = ' + str(self.VariableOffset) + "," + \
                    'HiiDefaultValue = ' + str(self.HiiDefaultValue) + "," + \
                    'VpdOffset = ' + str(self.VpdOffset) + "," + \
                    'DefaultValue = ' + str(self.DefaultValue) + ","
        return Rtn
## PcdErrorClass
#
#
#
class PcdErrorClass(object):
    def __init__(self):
        self.ValidValueList = ''
        self.ValidValueListLang = ''
        self.ValidValueRange = ''
        self.Expression = ''
        self.ErrorNumber = ''
        self.ErrorMessage = []

## PcdClass
#
# This class defined Pcd item used in Module/Platform/Package files
# 
# @param CommonClass:          Inherited from CommonClass class
# @param CName:                Input value for CName, default is ''
# @param Token:                Input value for Token, default is ''
# @param TokenSpaceGuidCName:  Input value for TokenSpaceGuidCName, default is ''
# @param DatumType:            Input value for DatumType, default is ''
# @param MaxDatumSize:         Input value for MaxDatumSize, default is ''
# @param DefaultValue:         Input value for DefaultValue, default is ''
# @param ItemType:             Input value for ItemType, default is ''
# @param ValidUsage:           Input value for ValidUsage, default is []
# @param SkuInfoList:          Input value for SkuInfoList, default is {}
# @param SupModuleList:        Input value for SupModuleList, default is []
#
# @var CName:                  To store value for CName
# @var Token:                  To store value for Token
# @var TokenSpaceGuidCName:    To store value for TokenSpaceGuidCName
# @var DatumType:              To store value for DatumType, selection scope is in below list
#                              UINT8 | UINT16 | UINT32 | UINT64 | VOID* | BOOLEAN 
# @var MaxDatumSize:           To store value for MaxDatumSize
# @var DefaultValue:           To store value for DefaultValue
# @var ItemType:               To store value for ItemType, selection scope is in below list
#                              FEATURE_FLAG | FIXED_AT_BUILD | PATCHABLE_IN_MODULE | DYNAMIC | DYNAMIC_EX
# @var ValidUsage:             To store value for ValidUsage, selection scope is in below list
#                              FEATURE_FLAG | FIXED_AT_BUILD | PATCHABLE_IN_MODULE | DYNAMIC | DYNAMIC_EX
# @var SkuInfoList:            To store value for SkuInfoList
#                              It is a set structure as { [SkuIdName] : SkuInfoClass } 
# @var SupModuleList:          To store value for SupModuleList, selection scope is in below list
#                              BASE | SEC | PEI_CORE | PEIM | DXE_CORE | DXE_DRIVER | DXE_RUNTIME_DRIVER | DXE_SAL_DRIVER | DXE_SMM_DRIVER | UEFI_DRIVER | UEFI_APPLICATION | USER_DEFINED | SMM_CORE
#
class PcdClass(CommonClass):
    def __init__(self, CName = '', Token = '', TokenSpaceGuidCName = '', DatumType = '', MaxDatumSize = '', DefaultValue = '', ItemType = '', ValidUsage = None, SkuInfoList = None, SupModuleList = None):
        self.CName = CName
        self.Token = Token
        self.TokenSpaceGuidCName = TokenSpaceGuidCName
        self.DatumType = DatumType
        self.MaxDatumSize = MaxDatumSize
        self.DefaultValue = DefaultValue
        self.ItemType = ItemType
        self.ValidUsage = ValidUsage
        self.PcdItemType = ''
        self.TokenSpaceGuidValue = ''
        self.PcdUsage = ''
        self.PcdCName = ''
        self.Value = ''
        self.Offset = ''
        if self.ValidUsage == None:
            self.ValidUsage = []
        self.SkuInfoList = SkuInfoList
        if self.SkuInfoList  == None:
            self.SkuInfoList  = {}
        self.SupModuleList = SupModuleList
        if self.SupModuleList == None:
            self.SupModuleList = []
        CommonClass.__init__(self)
        self.PcdErrors = []

## BuildOptionClass
#
# This class defined BuildOption item used in Module/Platform/Package files
# 
# @param IncludeStatementClass:  Inherited from IncludeStatementClass class
# @param ToolChainFamily:        Input value for ToolChainFamily, default is ''
# @param ToolChain:              Input value for ToolChain, default is ''
# @param Option:                 Input value for Option, default is ''
#
# @var Statement:                To store value for Statement
#                                It is a string in a special format as "Family:Target_TagName_Tarch_ToolCode_FLAGS = String"
# @var ToolChainFamily:          To store value for ToolChainFamily
# @var ToolChain:                To store value for ToolChain
# @var Option:                   To store value for Option
# @var BuildTarget:              To store value for BuildTarget
# @var TagName:                  To store value for TagName
# @var ToolCode:                 To store value for ToolCode
# @var SupArchList:              To store value for SupArchList, selection scope is in below list
#                                EBC | IA32 | X64 | IPF | ARM | PPC | AARCH64
#
class BuildOptionClass(IncludeStatementClass):
    def __init__(self, ToolChainFamily = '', ToolChain = '', Option = ''):
        IncludeStatementClass.__init__(self)
        self.Statement = ''                               
        self.ToolChainFamily = ToolChainFamily
        self.ToolChain = ToolChain
        self.Option = Option
        self.BuildTarget = ''
        self.TagName = ''
        self.ToolCode = ''
        self.SupArchList = []

## IncludeClass
#
# This class defined Include item used in Module/Platform/Package files
# 
# @param CommonClass:  Inherited from CommonClass class
#
# @var FilePath:       To store value for FilePath
# @var ModuleType:     To store value for ModuleType
# @var Comment:        To store value for Comment
#
class IncludeClass(CommonClass):
    def __init__(self):
        self.FilePath = ''
        self.ModuleType = ''
        self.SupModuleList = []
        self.Comment = ''
        CommonClass.__init__(self)        

## FileClass
#
#
class FileClass(CommonClass):
    def __init__(self):
        self.Filename = ''
        self.Executable = ''
        self.Family = ''
        self.FileType = ''
        CommonClass.__init__(self)
        

## MiscFileClass
#
#
class MiscFileClass(CommonHeaderClass):
    def __init__(self):
        CommonHeaderClass.__init__(self)
        self.Name = ''
        self.Files = []
    

## UserExtensionsClass
#
# This class defined UserExtensions item used in Module/Platform/Package files
# 
# @param object:    Inherited from object class
#
# @var UserID:      To store value for UserID
# @var Identifier:  To store value for Identifier
# @var Content:     To store value for Content
#       
class UserExtensionsClass(object):
    def __init__(self):
        self.UserID = ''
        self.Identifier = 0
        self.Content = ''
        self.Defines = []
        self.BuildOptions = []
