## @file
# This file is used to define common items of class object
#
# Copyright (c) 2011 - 2014, 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.

'''
Common Object
'''
from Library.DataType import TAB_LANGUAGE_EN_US

## HelpTextObject
#
# @param object:       Inherited from object class
#
class HelpTextObject(object):
    def __init__(self):
        self.HelpText = TextObject()
    
    def SetHelpText(self, HelpText):
        self.HelpText = HelpText
    
    def GetHelpText(self):
        return self.HelpText

## HelpTextListObject
#
# @param object:       Inherited from object class
#
class HelpTextListObject(object):
    def __init__(self):
        self.HelpTextList = []
    
    def SetHelpTextList(self, HelpTextList):
        self.HelpTextList = HelpTextList
    
    def GetHelpTextList(self):
        return self.HelpTextList

## PromptListObject
#
# @param object:       Inherited from object class
#
class PromptListObject(object):
    def __init__(self):
        self.PromptList = []
    
    def SetPromptList(self, PromptList):
        self.PromptList = PromptList
    
    def GetPromptList(self):
        return self.PromptList
    
## CommonPropertiesObject
#
# This class defined common attribution 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 ''
# @param HelpTextList: Input value for HelpTextList, default is []
#
class CommonPropertiesObject(HelpTextObject, HelpTextListObject):
    def __init__(self):
        self.Usage = []
        self.FeatureFlag = ''
        self.SupArchList = []
        self.GuidValue = ''
        HelpTextObject.__init__(self)
        HelpTextListObject.__init__(self)
        
    def SetUsage(self, Usage):
        self.Usage = Usage

    def GetUsage(self):
        return self.Usage

    def SetFeatureFlag(self, FeatureFlag):
        self.FeatureFlag = FeatureFlag

    def GetFeatureFlag(self):
        return self.FeatureFlag

    def SetSupArchList(self, SupArchList):
        self.SupArchList = SupArchList

    def GetSupArchList(self):
        return self.SupArchList
    
    def SetGuidValue(self, GuidValue):
        self.GuidValue = GuidValue
        
    def GetGuidValue(self):
        return self.GuidValue

## CommonHeaderObject
#
# This class defined common header items used in Module/Platform/Package files
#
# @param object:          Inherited from object class
#
class CommonHeaderObject(object):
    def __init__(self):
        self.AbstractList = []
        self.DescriptionList = []
        self.CopyrightList = []
        self.LicenseList = []

    def SetAbstract(self, Abstract):
        if isinstance(Abstract, list):
            self.AbstractList = Abstract
        else:
            self.AbstractList.append(Abstract)

    def GetAbstract(self):
        return self.AbstractList

    def SetDescription(self, Description):
        if isinstance(Description, list):
            self.DescriptionList = Description
        else:
            self.DescriptionList.append(Description)

    def GetDescription(self):
        return self.DescriptionList

    def SetCopyright(self, Copyright):
        if isinstance(Copyright, list):
            self.CopyrightList = Copyright
        else:
            self.CopyrightList.append(Copyright)

    def GetCopyright(self):
        return self.CopyrightList

    def SetLicense(self, License):
        if isinstance(License, list):
            self.LicenseList = License
        else:
            self.LicenseList.append(License)

    def GetLicense(self):
        return self.LicenseList

## BinaryHeaderObject
#
# This class defined Binary header items used in Module/Platform/Package files
#
# @param object:          Inherited from object class
#
class BinaryHeaderObject(object):
    def __init__(self):
        self.BinaryHeaderAbstractList = []
        self.BinaryHeaderDescriptionList = []
        self.BinaryHeaderCopyrightList = []
        self.BinaryHeaderLicenseList = []

    def SetBinaryHeaderAbstract(self, Abstract):
        if isinstance(Abstract, list) and Abstract:
            self.BinaryHeaderAbstractList = Abstract
        elif isinstance(Abstract, tuple) and Abstract[1]:
            self.BinaryHeaderAbstractList.append(Abstract)

    def GetBinaryHeaderAbstract(self):
        return self.BinaryHeaderAbstractList

    def SetBinaryHeaderDescription(self, Description):
        if isinstance(Description, list) and Description:
            self.BinaryHeaderDescriptionList = Description
        elif isinstance(Description, tuple) and Description[1]:
            self.BinaryHeaderDescriptionList.append(Description)

    def GetBinaryHeaderDescription(self):
        return self.BinaryHeaderDescriptionList

    def SetBinaryHeaderCopyright(self, Copyright):
        if isinstance(Copyright, list) and Copyright:
            self.BinaryHeaderCopyrightList = Copyright
        elif isinstance(Copyright, tuple) and Copyright[1]:
            self.BinaryHeaderCopyrightList.append(Copyright)

    def GetBinaryHeaderCopyright(self):
        return self.BinaryHeaderCopyrightList

    def SetBinaryHeaderLicense(self, License):
        if isinstance(License, list) and License:
            self.BinaryHeaderLicenseList = License
        elif isinstance(License, tuple) and License[1]:
            self.BinaryHeaderLicenseList.append(License)

    def GetBinaryHeaderLicense(self):
        return self.BinaryHeaderLicenseList
    
## ClonedRecordObject
#
# This class defined ClonedRecord items used in Module/Platform/Package files
# 
# @param object:        Inherited from object class
#
class ClonedRecordObject(object):
    def __init__(self):
        self.IdNum = 0
        self.FarGuid = ''
        self.PackageGuid = ''
        self.PackageVersion = ''
        self.ModuleGuid = ''
        self.ModuleVersion = ''

    def SetId(self, IdNo):
        self.IdNum = IdNo

    def GetId(self):
        return self.IdNum

    def SetFarGuid(self, FarGuid):
        self.FarGuid = FarGuid

    def GetFarGuid(self):
        return self.FarGuid

    def SetPackageGuid(self, PackageGuid):
        self.PackageGuid = PackageGuid

    def GetPackageGuid(self):
        return self.PackageGuid

    def SetPackageVersion(self, PackageVersion):
        self.PackageVersion = PackageVersion

    def GetPackageVersion(self):
        return self.PackageVersion

    def SetModuleGuid(self, ModuleGuid):
        self.ModuleGuid = ModuleGuid

    def GetModuleGuid(self):
        return self.ModuleGuid

    def SetModuleVersion(self, ModuleVersion):
        self.ModuleVersion = ModuleVersion

    def GetModuleVersion(self):
        return self.ModuleVersion

## TextObject
#
# This class defined Text item used in PKG file
#
# @param object:     Inherited from object class
#
class TextObject(object):
    def __init__(self):
        self.Lang = TAB_LANGUAGE_EN_US
        self.String = ''

    def SetLang(self, Lang):
        self.Lang = Lang

    def GetLang(self):
        return self.Lang

    def SetString(self, String):
        self.String = String

    def GetString(self):
        return self.String

## FileNameObject
#
# This class defined File item used in module, for binary files
#
# @param CommonPropertiesObject:   Inherited from CommonPropertiesObject class
#
class FileNameObject(CommonPropertiesObject):
    def __init__(self):
        self.FileType = ''
        self.Filename = ''
        CommonPropertiesObject.__init__(self)
        
    def SetFileType(self, FileType):
        self.FileType = FileType

    def GetFileType(self):
        return self.FileType

    def SetFilename(self, Filename):
        self.Filename = Filename

    def GetFilename(self):
        return self.Filename

## FileObject
#
# This class defined File item used in PKG file
#
# @param object:   Inherited from object class
#
class FileObject(object):
    def __init__(self):
        self.Executable = '' 
        self.Uri = ''
        self.OsType = ''
        
    def SetExecutable(self, Executable):
        self.Executable = Executable

    def GetExecutable(self):
        return self.Executable

    def SetURI(self, URI):
        self.Uri = URI

    def GetURI(self):
        return self.Uri

    def SetOS(self, OsType):
        self.OsType = OsType

    def GetOS(self):
        return self.OsType
    
## 
# MiscFileObject is used for xml
#
# @param CommonHeaderObject:   Inherited from CommonHeaderObject class
#
class MiscFileObject(CommonHeaderObject):
    def __init__(self):
        self.Name = ''
        self.FileList = [] 
        CommonHeaderObject.__init__(self)
        
    def SetName(self, Name):
        self.Name = Name
    
    def GetName(self):
        return self.Name
    
    def SetFileList(self, FileList):
        self.FileList = FileList
        
    def GetFileList(self):
        return self.FileList

##
# ToolsObject
#
class ToolsObject(MiscFileObject):
    pass

## GuidVersionObject
#
# This class defined GUID/Version items used in PKG file
#
# @param object:     Inherited from object class
#
class GuidVersionObject(object):
    def __init__(self):
        self.Guid = ''
        self.Version = ''

    def SetGuid(self, Guid):
        self.Guid = Guid

    def GetGuid(self):
        return self.Guid

    def SetVersion(self, Version):
        self.Version = Version

    def GetVersion(self):
        return self.Version

## IdentificationObject
#
# This class defined Identification items used in Module/Platform/Package files
#
# @param object:    Inherited from object class
#
class IdentificationObject(GuidVersionObject):
    def __init__(self):
        self.Name = ''
        self.BaseName = ''
        self.FileName = ''
        self.FullPath = ''
        self.RelaPath = ''
        self.PackagePath = ''
        self.ModulePath = ''
        self.CombinePath = ''
        GuidVersionObject.__init__(self)
        
    def SetName(self, Name):
        self.Name = Name

    def GetName(self):
        return self.Name

    def SetBaseName(self, BaseName):
        self.BaseName = BaseName

    def GetBaseName(self):
        return self.BaseName

    def SetFileName(self, FileName):
        self.FileName = FileName

    def GetFileName(self):
        return self.FileName

    def SetFullPath(self, FullPath):
        self.FullPath = FullPath

    def GetFullPath(self):
        return self.FullPath

    def SetRelaPath(self, RelaPath):
        self.RelaPath = RelaPath

    def GetRelaPath(self):
        return self.RelaPath

    def SetPackagePath(self, PackagePath):
        self.PackagePath = PackagePath

    def GetPackagePath(self):
        return self.PackagePath

    def SetModulePath(self, ModulePath):
        self.ModulePath = ModulePath

    def GetModulePath(self):
        return self.ModulePath

    def SetCombinePath(self, CombinePath):
        self.CombinePath = CombinePath

    def GetCombinePath(self):
        return self.CombinePath

## GuidProtocolPpiCommonObject
#
# This class defined Guid, Protocol and Ppi like items used in 
# Module/Platform/Package files
#
# @param CommonPropertiesObject:    Inherited from CommonPropertiesObject class
#
class GuidProtocolPpiCommonObject(CommonPropertiesObject):
    def __init__(self):
        self.Name = ''
        self.CName = ''
        self.Guid = ''
        self.SupModuleList = []
        CommonPropertiesObject.__init__(self)
        
    def SetName(self, Name):
        self.Name = Name

    def GetName(self):
        return self.Name

    def SetCName(self, CName):
        self.CName = CName

    def GetCName(self):
        return self.CName

    def SetGuid(self, Guid):
        self.Guid = Guid

    def GetGuid(self):
        return self.Guid

    def SetSupModuleList(self, SupModuleList):
        self.SupModuleList = SupModuleList

    def GetSupModuleList(self):
        return self.SupModuleList

## GuidObject
#
# This class defined Guid item used in Module/Platform/Package files
#
# @param GuidProtocolPpiCommonObject:  GuidProtocolPpiCommonObject
#
class GuidObject(GuidProtocolPpiCommonObject):
    def __init__(self):
        self.VariableName = ''
        self.GuidTypeList = []
        GuidProtocolPpiCommonObject.__init__(self)
    def SetVariableName(self, VariableName):
        self.VariableName = VariableName

    def GetVariableName(self):
        return self.VariableName

    def SetGuidTypeList(self, GuidTypeList):
        self.GuidTypeList = GuidTypeList

    def GetGuidTypeList(self):
        return self.GuidTypeList

## ProtocolObject
#
# This class defined Protocol item used in Module/Platform/Package files
#
# @param GuidProtocolPpiCommonObject:  Inherited from 
#                                      GuidProtocolPpiCommonObject
#
class ProtocolObject(GuidProtocolPpiCommonObject):
    def __init__(self):
        self.Notify = False
        GuidProtocolPpiCommonObject.__init__(self)
    def SetNotify(self, Notify):
        self.Notify = Notify

    def GetNotify(self):
        return self.Notify

## PpiObject
#
# This class defined Ppi item used in Module/Platform/Package files
#
# @param GuidProtocolPpiCommonObject:  Inherited from 
#                                      GuidProtocolPpiCommonObject
#
class PpiObject(GuidProtocolPpiCommonObject):
    def __init__(self):
        self.Notify = False
        GuidProtocolPpiCommonObject.__init__(self)
    def SetNotify(self, Notify):
        self.Notify = Notify

    def GetNotify(self):
        return self.Notify

## DefineObject
#
# This class defined item DEFINE used in Module/Platform/Package files
#
# @param object:  Inherited from object class
#
class DefineClass(object):
    def __init__(self):
        self.Define = {}

## UserExtensionObject
#
# @param object:  Inherited from object class
#
class UserExtensionObject(object):
    def __init__(self):
        self.UserID = ''
        self.Identifier = ''
        self.BinaryAbstractList = []
        self.BinaryDescriptionList = []
        self.BinaryCopyrightList = []
        self.BinaryLicenseList = []
        self.UniLangDefsList = []
        #
        # { Statement : Arch , ... }    
        #
        self.DefinesDict = {} 
        #
        # { Arch : Statement , ... }
        #
        self.BuildOptionDict = {} 
        self.IncludesDict = {}
        self.SourcesDict = {}
        self.BinariesDict = {}
        #
        # UserExtension statement from meta-data file [UserExtension] section
        #
        self.Statement = ''
        self.SupArchList = []
        
    def SetStatement(self, Statement):
        self.Statement = Statement
    
    def GetStatement(self):
        return self.Statement

    def SetSupArchList(self, ArchList):
        self.SupArchList = ArchList
    
    def GetSupArchList(self):
        return self.SupArchList
        
    def SetUserID(self, UserID):
        self.UserID = UserID
    
    def GetUserID(self):
        return self.UserID
    
    def SetIdentifier(self, Identifier):
        self.Identifier = Identifier
        
    def GetIdentifier(self):
        return self.Identifier
    
    def SetUniLangDefsList(self, UniLangDefsList):
        self.UniLangDefsList = UniLangDefsList
        
    def GetUniLangDefsList(self):
        return self.UniLangDefsList
    
    def SetBinaryAbstract(self, BinaryAbstractList):
        self.BinaryAbstractList = BinaryAbstractList
    
    def GetBinaryAbstract(self, Lang=None):
        if Lang:
            for (Key, Value) in self.BinaryAbstractList:
                if Key == Lang:
                    return Value
            return None
        else:
            return self.BinaryAbstractList
    
    def SetBinaryDescription(self, BinaryDescriptionList):
        self.BinaryDescriptionList = BinaryDescriptionList
    
    def GetBinaryDescription(self, Lang=None):
        if Lang:
            for (Key, Value) in self.BinaryDescriptionList:
                if Key == Lang:
                    return Value
            return None
        else:
            return self.BinaryDescriptionList
    
    def SetBinaryCopyright(self, BinaryCopyrightList):
        self.BinaryCopyrightList = BinaryCopyrightList
    
    def GetBinaryCopyright(self, Lang=None):
        if Lang:
            for (Key, Value) in self.BinaryCopyrightList:
                if Key == Lang:
                    return Value
            return None
        else:
            return self.BinaryCopyrightList
    
    def SetBinaryLicense(self, BinaryLicenseList):
        self.BinaryLicenseList = BinaryLicenseList
    
    def GetBinaryLicense(self, Lang=None):
        if Lang:
            for (Key, Value) in self.BinaryLicenseList:
                if Key == Lang:
                    return Value
            return None
        else:
            return self.BinaryLicenseList
    
    def SetDefinesDict(self, DefinesDict):
        self.DefinesDict = DefinesDict
    
    def GetDefinesDict(self):
        return self.DefinesDict
    
    def SetBuildOptionDict(self, BuildOptionDict):
        self.BuildOptionDict = BuildOptionDict
        
    def GetBuildOptionDict(self):
        return self.BuildOptionDict

    def SetIncludesDict(self, IncludesDict):
        self.IncludesDict = IncludesDict
        
    def GetIncludesDict(self):
        return self.IncludesDict

    def SetSourcesDict(self, SourcesDict):
        self.SourcesDict = SourcesDict
        
    def GetSourcesDict(self):
        return self.SourcesDict

    def SetBinariesDict(self, BinariesDict):
        self.BinariesDict = BinariesDict
        
    def GetBinariesDict(self):
        return self.BinariesDict

## LibraryClassObject
#
# This class defined Library item used in Module/Platform/Package files
#
# @param CommonPropertiesObject:  Inherited from CommonPropertiesObject class
#
class LibraryClassObject(CommonPropertiesObject):
    def __init__(self):
        self.LibraryClass = ''
        self.IncludeHeader = ''
        self.SupModuleList = []
        self.RecommendedInstance = GuidVersionObject()
        CommonPropertiesObject.__init__(self)
        
    def SetLibraryClass(self, LibraryClass):
        self.LibraryClass = LibraryClass
    
    def GetLibraryClass(self):
        return self.LibraryClass
    
    def SetSupModuleList(self, SupModuleList):
        self.SupModuleList = SupModuleList
    
    def GetSupModuleList(self):
        return self.SupModuleList
    
    def SetIncludeHeader(self, IncludeHeader):
        self.IncludeHeader = IncludeHeader
        
    def GetIncludeHeader(self):
        return self.IncludeHeader
    
    def SetRecommendedInstance(self, RecommendedInstance):
        self.RecommendedInstance = RecommendedInstance
    
    def GetRecommendedInstance(self):
        return self.RecommendedInstance


## PcdErrorObject
#
# @param object:  Inherited from object class
#
class PcdErrorObject(object):
    def __init__(self):
        self.ValidValue = ''
        self.ValidValueLang = ''
        self.ValidValueRange = ''
        self.Expression = ''
        self.ErrorNumber = ''
        self.ErrorMessageList = []
        self.TokenSpaceGuidCName = ''
        self.CName = ''
        self.FileLine = ''
        self.LineNum = 0

    def SetValidValue(self, ValidValue):
        self.ValidValue = ValidValue
    
    def GetValidValue(self):
        return self.ValidValue
    
    def SetValidValueLang(self, ValidValueLang):
        self.ValidValueLang = ValidValueLang
        
    def GetValidValueLang(self):
        return self.ValidValueLang
    
    def SetValidValueRange(self, ValidValueRange):
        self.ValidValueRange = ValidValueRange
        
    def GetValidValueRange(self):
        return self.ValidValueRange
    
    def SetExpression(self, Expression):
        self.Expression = Expression
    
    def GetExpression(self):
        return self.Expression
    
    def SetErrorNumber(self, ErrorNumber):
        self.ErrorNumber = ErrorNumber
        
    def GetErrorNumber(self):
        return self.ErrorNumber
    
    def SetErrorMessageList(self, ErrorMessageList):
        self.ErrorMessageList = ErrorMessageList
        
    def GetErrorMessageList(self):
        return self.ErrorMessageList
    
    def SetTokenSpaceGuidCName(self, TokenSpaceGuidCName):
        self.TokenSpaceGuidCName = TokenSpaceGuidCName
        
    def GetTokenSpaceGuidCName(self):
        return self.TokenSpaceGuidCName
    
    def SetCName(self, CName):
        self.CName = CName
        
    def GetCName(self):
        return self.CName
    
    def SetFileLine(self, FileLine):
        self.FileLine = FileLine
        
    def GetFileLine(self):
        return self.FileLine
    
    def SetLineNum(self, LineNum):
        self.LineNum = LineNum
        
    def GetLineNum(self):
        return self.LineNum
    
    
## IncludeObject
#
# This class defined Include item used in Module/Platform/Package files
# 
# @param CommonPropertiesObject:  Inherited from CommonPropertiesObject class
#
class IncludeObject(CommonPropertiesObject):
    def __init__(self):
        self.FilePath = ''
        self.ModuleType = ''
        self.SupModuleList = []
        self.Comment = ''
        CommonPropertiesObject.__init__(self)
    
    def SetFilePath(self, FilePath):
        self.FilePath = FilePath
    
    def GetFilePath(self):
        return self.FilePath
    
    def SetModuleType(self, ModuleType):
        self.ModuleType = ModuleType
    
    def GetModuleType(self):
        return self.ModuleType
    
    def SetSupModuleList(self, SupModuleList):
        self.SupModuleList = SupModuleList
 
    def GetSupModuleList(self):
        return self.SupModuleList              
               
    def SetComment(self, Comment):
        self.Comment = Comment
 
    def GetComment(self):
        return self.Comment 
    
## PcdObject
#
# This class defined Pcd item used in Module/Platform/Package files
#
# @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 []
#
class PcdObject(CommonPropertiesObject, HelpTextListObject, PromptListObject):
    def __init__(self):
        self.PcdCName = ''
        self.CName = ''
        self.Token = ''
        self.TokenSpaceGuidCName = ''
        self.TokenSpaceGuidValue = ''
        self.DatumType = ''
        self.MaxDatumSize = ''
        self.DefaultValue = ''
        self.Offset = ''
        self.ValidUsage = ''
        self.ItemType = ''
        self.PcdErrorsList = [] 
        self.SupModuleList = []        
        CommonPropertiesObject.__init__(self)
        HelpTextListObject.__init__(self)
        PromptListObject.__init__(self)
    
    def SetPcdCName(self, PcdCName):
        self.PcdCName = PcdCName
        
    def GetPcdCName(self):
        return self.PcdCName
    
    def SetCName(self, CName):
        self.CName = CName
    
    def GetCName(self):
        return self.CName
    
    def SetToken(self, Token):
        self.Token = Token
    
    def GetOffset(self):
        return self.Offset

    def SetOffset(self, Offset):
        self.Offset = Offset
    
    def GetToken(self):
        return self.Token
    
    def SetTokenSpaceGuidCName(self, TokenSpaceGuidCName):
        self.TokenSpaceGuidCName = TokenSpaceGuidCName
    
    def GetTokenSpaceGuidCName(self):
        return self.TokenSpaceGuidCName
    
    def SetTokenSpaceGuidValue(self, TokenSpaceGuidValue):
        self.TokenSpaceGuidValue = TokenSpaceGuidValue
    
    def GetTokenSpaceGuidValue(self):
        return self.TokenSpaceGuidValue
    
    def SetDatumType(self, DatumType):
        self.DatumType = DatumType
        
    def GetDatumType(self):
        return self.DatumType
    
    def SetMaxDatumSize(self, MaxDatumSize):
        self.MaxDatumSize = MaxDatumSize
    
    def GetMaxDatumSize(self):
        return self.MaxDatumSize

    def SetDefaultValue(self, DefaultValue):
        self.DefaultValue = DefaultValue
        
    def GetDefaultValue(self):
        return self.DefaultValue

    def SetValidUsage(self, ValidUsage):
        self.ValidUsage = ValidUsage
    
    def GetValidUsage(self):
        return self.ValidUsage
    
    def SetPcdErrorsList(self, PcdErrorsList):
        self.PcdErrorsList = PcdErrorsList
    
    def GetPcdErrorsList(self):
        return self.PcdErrorsList

    def SetItemType(self, ItemType):
        self.ItemType = ItemType
        
    def GetItemType(self):
        return self.ItemType

    def SetSupModuleList(self, SupModuleList):
        self.SupModuleList = SupModuleList
        
    def GetSupModuleList(self):
        return self.SupModuleList
