## @file
# This file is used to define a class object to describe a module
#
# Copyright (c) 2011 - 2018, 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.

'''
ModuleObject
'''

##
# Import Modules
#
from Object.POM.CommonObject import CommonPropertiesObject
from Object.POM.CommonObject import IdentificationObject
from Object.POM.CommonObject import CommonHeaderObject
from Object.POM.CommonObject import BinaryHeaderObject
from Object.POM.CommonObject import HelpTextListObject
from Object.POM.CommonObject import GuidVersionObject


##
# BootModeObject
#
class BootModeObject(CommonPropertiesObject, HelpTextListObject):
    def __init__(self):
        self.SupportedBootModes = ''
        CommonPropertiesObject.__init__(self)
        HelpTextListObject.__init__(self)

    def SetSupportedBootModes(self, SupportedBootModes):
        self.SupportedBootModes = SupportedBootModes

    def GetSupportedBootModes(self):
        return self.SupportedBootModes

##
# EventObject
#
class EventObject(CommonPropertiesObject, HelpTextListObject):
    def __init__(self):
        self.EventType = ''
        CommonPropertiesObject.__init__(self)
        HelpTextListObject.__init__(self)

    def SetEventType(self, EventType):
        self.EventType = EventType

    def GetEventType(self):
        return self.EventType

##
# HobObject
#
class HobObject(CommonPropertiesObject, HelpTextListObject):
    def __init__(self):
        self.HobType = ''
        CommonPropertiesObject.__init__(self)
        HelpTextListObject.__init__(self)

    def SetHobType(self, HobType):
        self.HobType = HobType

    def GetHobType(self):
        return self.HobType

##
# SpecObject
#
class SpecObject(object):
    def __init__(self):
        self.Spec = ''
        self.Version = ''

    def SetSpec(self, Spec):
        self.Spec = Spec

    def GetSpec(self):
        return self.Spec

    def SetVersion(self, Version):
        self.Version = Version

    def GetVersion(self):
        return self.Version

## ModuleHeaderObject
#
# This class defined header items used in Module file
#
class ModuleHeaderObject(IdentificationObject, CommonHeaderObject, BinaryHeaderObject):
    def __init__(self):
        self.IsLibrary = False
        self.IsLibraryModList = []
        self.ModuleType = ''
        self.BinaryModule = False
        self.PcdIsDriver = ''
        self.PiSpecificationVersion = ''
        self.UefiSpecificationVersion = ''
        self.UNIFlag = False
        self.ModuleUniFile = ''
        #
        # SpecObject
        #
        self.SpecList = []
        #
        # BootModeObject
        #
        self.BootModeList = []
        #
        # EventObject
        #
        self.EventList = []
        #
        # HobObject
        #
        self.HobList = []
        #
        # LibraryClassObject
        #
        self.LibraryClassList = []
        self.SupArchList = []
        IdentificationObject.__init__(self)
        CommonHeaderObject.__init__(self)
        BinaryHeaderObject.__init__(self)

    def SetIsLibrary(self, IsLibrary):
        self.IsLibrary = IsLibrary

    def GetIsLibrary(self):
        return self.IsLibrary

    def SetIsLibraryModList(self, IsLibraryModList):
        self.IsLibraryModList = IsLibraryModList

    def GetIsLibraryModList(self):
        return self.IsLibraryModList

    def SetModuleType(self, ModuleType):
        self.ModuleType = ModuleType

    def GetModuleType(self):
        return self.ModuleType

    def SetBinaryModule(self, BinaryModule):
        self.BinaryModule = BinaryModule

    def GetBinaryModule(self):
        return self.BinaryModule

    def SetPcdIsDriver(self, PcdIsDriver):
        self.PcdIsDriver = PcdIsDriver

    def GetPcdIsDriver(self):
        return self.PcdIsDriver

    def SetPiSpecificationVersion(self, PiSpecificationVersion):
        self.PiSpecificationVersion = PiSpecificationVersion

    def GetPiSpecificationVersion(self):
        return self.PiSpecificationVersion

    def SetUefiSpecificationVersion(self, UefiSpecificationVersion):
        self.UefiSpecificationVersion = UefiSpecificationVersion

    def GetUefiSpecificationVersion(self):
        return self.UefiSpecificationVersion

    def SetSpecList(self, SpecList):
        self.SpecList = SpecList

    def GetSpecList(self):
        return self.SpecList

    def SetBootModeList(self, BootModeList):
        self.BootModeList = BootModeList

    def GetBootModeList(self):
        return self.BootModeList

    def SetEventList(self, EventList):
        self.EventList = EventList

    def GetEventList(self):
        return self.EventList

    def SetHobList(self, HobList):
        self.HobList = HobList

    def GetHobList(self):
        return self.HobList

    def SetLibraryClassList(self, LibraryClassList):
        self.LibraryClassList = LibraryClassList

    def GetLibraryClassList(self):
        return self.LibraryClassList

    def SetSupArchList(self, SupArchList):
        self.SupArchList = SupArchList

    def GetSupArchList(self):
        return self.SupArchList

    def SetModuleUniFile(self, ModuleUniFile):
        self.ModuleUniFile = ModuleUniFile

    def GetModuleUniFile(self):
        return self.ModuleUniFile
##
# SourceFileObject
#
class SourceFileObject(CommonPropertiesObject):
    def __init__(self):
        CommonPropertiesObject.__init__(self)
        self.SourceFile = ''
        self.TagName = ''
        self.ToolCode = ''
        self.Family = ''
        self.FileType = ''

    def SetSourceFile(self, SourceFile):
        self.SourceFile = SourceFile

    def GetSourceFile(self):
        return  self.SourceFile

    def SetTagName(self, TagName):
        self.TagName = TagName

    def GetTagName(self):
        return self.TagName

    def SetToolCode(self, ToolCode):
        self.ToolCode = ToolCode

    def GetToolCode(self):
        return self.ToolCode

    def SetFamily(self, Family):
        self.Family = Family

    def GetFamily(self):
        return self.Family

    def SetFileType(self, FileType):
        self.FileType = FileType

    def GetFileType(self):
        return self.FileType


##
# BinaryFileObject
#
class BinaryFileObject(CommonPropertiesObject):
    def __init__(self):
        self.FileNamList = []
        self.AsBuiltList = []
        CommonPropertiesObject.__init__(self)

    def SetFileNameList(self, FileNamList):
        self.FileNamList = FileNamList

    def GetFileNameList(self):
        return self.FileNamList

    def SetAsBuiltList(self, AsBuiltList):
        self.AsBuiltList = AsBuiltList

    def GetAsBuiltList(self):
        return self.AsBuiltList


##
# AsBuildLibraryClassObject
#
class AsBuildLibraryClassObject(object):
    def __init__(self):
        self.LibGuid = ''
        self.LibVersion = ''
        self.SupArchList = []

    def SetLibGuid(self, LibGuid):
        self.LibGuid = LibGuid
    def GetLibGuid(self):
        return self.LibGuid

    def SetLibVersion(self, LibVersion):
        self.LibVersion = LibVersion
    def GetLibVersion(self):
        return self.LibVersion

    def SetSupArchList(self, SupArchList):
        self.SupArchList = SupArchList
    def GetSupArchList(self):
        return self.SupArchList

##
# AsBuiltObject
#
class AsBuiltObject(object):
    def __init__(self):
        #
        # list of PcdObject
        #
        self.PatchPcdList = []
        #
        # list of PcdObject
        #
        self.PcdExValueList = []
        #
        # list of GuidVersionObject
        #
        self.LibraryInstancesList = []
        #
        # List of BinaryBuildFlag object
        #
        self.BinaryBuildFlagList = []

    def SetPatchPcdList(self, PatchPcdList):
        self.PatchPcdList = PatchPcdList

    def GetPatchPcdList(self):
        return self.PatchPcdList

    def SetPcdExList(self, PcdExValueList):
        self.PcdExValueList = PcdExValueList

    def GetPcdExList(self):
        return self.PcdExValueList

    def SetLibraryInstancesList(self, LibraryInstancesList):
        self.LibraryInstancesList = LibraryInstancesList

    def GetLibraryInstancesList(self):
        return self.LibraryInstancesList

    def SetBuildFlagsList(self, BinaryBuildFlagList):
        self.BinaryBuildFlagList = BinaryBuildFlagList

    def GetBuildFlagsList(self):
        return self.BinaryBuildFlagList

##
# BinaryBuildFlag, this object will include those fields that are not
# covered by the UPT Spec BinaryFile field
#
class BinaryBuildFlagObject(object):
    def __init__(self):
        self.Target = ''
        self.TagName = ''
        self.Family = ''
        self.AsBuiltOptionFlags = ''

    def SetTarget(self, Target):
        self.Target = Target

    def GetTarget(self):
        return self.Target

    def SetTagName(self, TagName):
        self.TagName = TagName

    def GetTagName(self):
        return self.TagName

    def SetFamily(self, Family):
        self.Family = Family

    def GetFamily(self):
        return self.Family

    def SetAsBuiltOptionFlags(self, AsBuiltOptionFlags):
        self.AsBuiltOptionFlags = AsBuiltOptionFlags
    def GetAsBuiltOptionFlags(self):
        return self.AsBuiltOptionFlags

##
# ExternObject
#
class ExternObject(CommonPropertiesObject):
    def __init__(self):
        self.EntryPoint = ''
        self.UnloadImage = ''
        self.Constructor = ''
        self.Destructor = ''
        self.SupModList = []
        CommonPropertiesObject.__init__(self)

    def SetEntryPoint(self, EntryPoint):
        self.EntryPoint = EntryPoint

    def GetEntryPoint(self):
        return self.EntryPoint

    def SetUnloadImage(self, UnloadImage):
        self.UnloadImage = UnloadImage

    def GetUnloadImage(self):
        return self.UnloadImage

    def SetConstructor(self, Constructor):
        self.Constructor = Constructor

    def GetConstructor(self):
        return self.Constructor

    def SetDestructor(self, Destructor):
        self.Destructor = Destructor

    def GetDestructor(self):
        return self.Destructor

    def SetSupModList(self, SupModList):
        self.SupModList = SupModList
    def GetSupModList(self):
        return self.SupModList

##
# DepexObject
#
class DepexObject(CommonPropertiesObject):
    def __init__(self):
        self.Depex = ''
        self.ModuelType = ''
        CommonPropertiesObject.__init__(self)

    def SetDepex(self, Depex):
        self.Depex = Depex

    def GetDepex(self):
        return self.Depex

    def SetModuleType(self, ModuleType):
        self.ModuelType = ModuleType

    def GetModuleType(self):
        return self.ModuelType

##
# PackageDependencyObject
#
class PackageDependencyObject(GuidVersionObject, CommonPropertiesObject):
    def __init__(self):
        self.Package = ''
        self.PackageFilePath = ''
        GuidVersionObject.__init__(self)
        CommonPropertiesObject.__init__(self)

    def SetPackageFilePath(self, PackageFilePath):
        self.PackageFilePath = PackageFilePath

    def GetPackageFilePath(self):
        return self.PackageFilePath

    def SetPackage(self, Package):
        self.Package = Package

    def GetPackage(self):
        return self.Package

##
# BuildOptionObject
#
class BuildOptionObject(CommonPropertiesObject):
    def __init__(self):
        CommonPropertiesObject.__init__(self)
        self.BuildOption = ''

    def SetBuildOption(self, BuildOption):
        self.BuildOption = BuildOption

    def GetBuildOption(self):
        return self.BuildOption

##
# ModuleObject
#
class ModuleObject(ModuleHeaderObject):
    def __init__(self):
        #
        # {Arch : ModuleHeaderObject}
        #
        self.HeaderDict = {}
        #
        # LibraryClassObject
        #
        self.LibraryClassList = []
        #
        # SourceFileObject
        #
        self.SourceFileList = []
        #
        # BinaryFileObject
        #
        self.BinaryFileList = []
        #
        # PackageDependencyObject
        #
        self.PackageDependencyList = []
        #
        # DepexObject
        #
        self.PeiDepex = []
        #
        # DepexObject
        #
        self.DxeDepex = []
        #
        # DepexObject
        #
        self.SmmDepex = []
        #
        # ProtocolObject
        #
        self.ProtocolList = []
        #
        # PpiObject
        #
        self.PpiList = []
        #
        # GuidObject
        #
        self.GuidList = []
        #
        # PcdObject
        #
        self.PcdList = []
        #
        # ExternObject
        #
        self.ExternList = []
        #
        # BuildOptionObject
        #
        self.BuildOptionList = []
        #
        # UserExtensionObject
        #
        self.UserExtensionList = []
        #
        # MiscFileObject
        #
        self.MiscFileList = []
        #
        # ClonedFromObject
        #
        self.ClonedFrom = None

        ModuleHeaderObject.__init__(self)

    def SetHeaderDict(self, HeaderDict):
        self.HeaderDict = HeaderDict

    def GetHeaderDict(self):
        return self.HeaderDict

    def SetLibraryClassList(self, LibraryClassList):
        self.LibraryClassList = LibraryClassList

    def GetLibraryClassList(self):
        return self.LibraryClassList

    def SetSourceFileList(self, SourceFileList):
        self.SourceFileList = SourceFileList

    def GetSourceFileList(self):
        return self.SourceFileList

    def SetBinaryFileList(self, BinaryFileList):
        self.BinaryFileList = BinaryFileList

    def GetBinaryFileList(self):
        return self.BinaryFileList

    def SetPackageDependencyList(self, PackageDependencyList):
        self.PackageDependencyList = PackageDependencyList

    def GetPackageDependencyList(self):
        return self.PackageDependencyList

    def SetPeiDepex(self, PeiDepex):
        self.PeiDepex = PeiDepex

    def GetPeiDepex(self):
        return self.PeiDepex

    def SetDxeDepex(self, DxeDepex):
        self.DxeDepex = DxeDepex

    def GetDxeDepex(self):
        return self.DxeDepex

    def SetSmmDepex(self, SmmDepex):
        self.SmmDepex = SmmDepex

    def GetSmmDepex(self):
        return self.SmmDepex

    def SetPpiList(self, PpiList):
        self.PpiList = PpiList

    def GetPpiList(self):
        return self.PpiList

    def SetProtocolList(self, ProtocolList):
        self.ProtocolList = ProtocolList

    def GetProtocolList(self):
        return self.ProtocolList

    def SetPcdList(self, PcdList):
        self.PcdList = PcdList

    def GetPcdList(self):
        return self.PcdList

    def SetGuidList(self, GuidList):
        self.GuidList = GuidList

    def GetGuidList(self):
        return self.GuidList

    def SetExternList(self, ExternList):
        self.ExternList = ExternList

    def GetExternList(self):
        return self.ExternList

    def SetBuildOptionList(self, BuildOptionList):
        self.BuildOptionList = BuildOptionList

    def GetBuildOptionList(self):
        return self.BuildOptionList

    def SetUserExtensionList(self, UserExtensionList):
        self.UserExtensionList = UserExtensionList

    def GetUserExtensionList(self):
        return self.UserExtensionList

    def SetMiscFileList(self, MiscFileList):
        self.MiscFileList = MiscFileList

    def GetMiscFileList(self):
        return self.MiscFileList

    def SetClonedFrom(self, ClonedFrom):
        self.ClonedFrom = ClonedFrom

    def GetClonedFrom(self):
        return self.ClonedFrom
